Existe uma maneira de executar um script de shell ecoando os comandos, mas sem executá-los?
Digamos que eu tenha um script removendo um arquivo cujo nome esteja armazenado em uma variável:
#!/bin/bash
set -v
FN="filename"
rm -f ${FN}
A adição set -v
fará eco dos seguintes comandos antes da execução:
$ ./scr.sh
FN="filename"
rm -f ${FN}
Agora, quero ver o fluxo desse script sem remover o arquivo. IOW, quero impedir qualquer efeito no ambiente externo e no sistema de arquivos. Isso é possível?
Eu poderia agrupar todos os comandos com um echo
comando, mas é cansativo para um script longo.
linux
bash
shell-script
ysap
fonte
fonte
Respostas:
Não há como percorrer um script para ver como ele seria executado sem realmente fazer isso. No seu exemplo, não há
if
instruções ou loops. Mas em scripts reais, muitas vezes há muitas instruções condicionais. O ramo que será obtido dependerá frequentemente do que aconteceu quando o shell executou o comando anterior. Se ele não executar o comando, não há como o shell saber qual saída geraria ou qual seria o código de retorno, do qual a próxima ramificação condicional ou instrução de atribuição pode depender.Se a questão é que você deseja examinar um script e saber o que ele faz antes de executá-lo, isso não é uma má idéia. Mas, realisticamente, a melhor maneira de fazer isso é apenas navegando no arquivo com
less
ouvi
ou algo semelhante.Adicionado
Se você está desenvolvendo um script e deseja percorrê-lo pela primeira vez, testando a lógica, mas sem causar nenhum dano se tiver um bug, a solução que geralmente posso usar é modificar apenas as declarações que poderiam causar algum dano colando um
echo
na frente.Isso geralmente funciona em scripts típicos da vida real porque (a) gerar as listas de itens sobre os quais você iterará ou o valor para o qual você definirá uma variável geralmente pode ser gerado sem alterar o sistema de arquivos e (b) geralmente é suficiente para suponha que se você executasse o comando, ele seria bem-sucedido.
fonte
trap read debug
qual fará uma leitura após cada linha executada e, em seguida, percorrê-lo lentamente com enter (isso é útil se você tiver um script muito longo e quiser testar pela primeira vez).Eu acho que você terá que repetir - no entanto, se você colocar o comando em uma variável, poderá ativá-lo e desativá-lo. Além disso, o comando pode ser uma função e tão sofisticado quanto você desejar.
fonte
D=eval
na parte ao vivo. Mas boa resposta!Você pode rastrear o fluxo usando a opção -x para bash, mas isso ainda executaria os comandos.
O melhor que você pode fazer é colocar eco ou comentar os comandos que têm efeitos externos, como o rm. Pelo menos você não precisaria mudar todas as linhas.
fonte
Não conheço nenhum método específico para execução a seco, mas podemos usar algumas precauções para entender um script desconhecido.
bash -n <script>
para verificação de sintaxe . No manual do gnu bash https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html-n Read commands but do not execute them; this may be used to check a script for syntax errors. This option is ignored by interactive shells.
alias rm="rm -i" alias cp="cp -i" alias mv="mv -i"
Para editores de fluxo como sedsed -i
(-i modifica o arquivo no local sem -i, ele executa uma execução a seco para sed, consulte a página de manual para obter detalhes) pode copiar o comando completo e executar. Antes do comando atual, ele mostra a saída na tela e, em seguida, use o comando para aguardar a entrada do usuário continuar. Exemplosed -i <pattern>
Substitua-o porsed <pattern> read -p "Press any key..." sed -i <pattern>
Também é sempre recomendável manter pontos de backup em seu sistema para que, em caso de emergência, os dados possam ser restaurados.
fonte
Faça
set –n
ou acrescenten
ao seuset –v
comando existente . Mas como isso faz com que o shell não avalie nenhum comando, nem mesmoif
ouwhile
, talvez você não tenha uma visão muito boa do fluxo operacional.fonte
Aqui está uma pequena construção que eu gosto de usar:
fonte
Se você deseja impedir que modificações ocorram, é possível executar o script como usuário sem privilégios:
No seu exemplo, isso será executado
FN="filename"
como de costume. Embora tecnicamente execute o comandorm -f ${FN}
também, nada acontecerá se ninguém não tiver as permissões necessárias para excluir o arquivo.Obviamente, isso causará problemas no fluxo de trabalho condicional. O fato de o
rm
comando falhar pode afetar outras partes do script.fonte