A $?
variável mantém o status de saída do último comando de execução. Existe uma variável que contém o último comando de execução em si?
bash
shell
scripting
environment-variables
Eimantas
fonte
fonte
Respostas:
Use
fc
para obter a linha de comando anterior. É normalmente usado para editar a linha de comando anterior no seu editor favorito, mas também possui um modo de "lista":last_command="$(fc -nl -1)"
fonte
caller
e as matrizes de bashBASH_LINENO
,BASH_SOURCE
eFUNCNAME
fazer uma espécie de rastreamento de pilha.Se o último comando foi executado sem argumentos, ele será salvo na
$_
variável Normalmente, ele contém o último argumento do comando anterior - portanto, se não houver argumentos, o valor de$_
é o último comando em si.Outra opção é aprender os detalhes do último comando em segundo plano . Como l0b0 escreveu,
$!
mantém seu PID - para que você possa analisar a saída deps $!
(possivelmente com opções de formatação adicionais paraps
).fonte
Não, mas você pode obtê-lo durante a execução para armazenar outros comandos:
$0
: Caminho do script atual do shell.$FUNCNAME
: "Nome da função atual.""$@"
: Todos os parâmetros do comando atual, citados separadamente.$!
: "PID (ID do processo) do último trabalho executado em segundo plano."$$
: "ID do processo (PID) do próprio script."O comando completo do script atual deve, portanto, ser
"$0" "$@"
. Se é uma função, deveria ser"$FUNCNAME" "$@"
. Convém armazenar isso em uma matriz para processamento futuro. Por exemplo, armazene isso emtest.sh
:Ao executar
./test.sh "first argument" "second argument"
, ele deve retornar:Quais são chamadas equivalentes.
fonte
BASH_COMMAND
variável, mas não parece ser útil de nenhuma forma, além do uso em armadilhas.some-command
em um script de shell e ele falhar. Vou ter um status diferente de zero$?
, "não" ainda será válido pela existência de retenção de variávelsome-command
?A
DEBUG
armadilha permite que você execute um comando antes de qualquer execução simples. Uma versão em cadeia do comando a ser executado (com palavras separadas por espaços) está disponível naBASH_COMMAND
variávelObserve que
previous_command
isso muda toda vez que você executa um comando, então salve-o em uma variável para usá-lo. Se você também deseja conhecer o status de retorno do comando anterior, salve os dois em um único comando.Se você deseja abortar apenas os comandos com falha, use
set -e
para fazer o script sair no primeiro comando com falha. Você pode exibir o último comando daEXIT
armadilha .Uma abordagem alternativa que pode funcionar para alguns usos é usar
set -x
para imprimir um rastreamento da execução do script e examinar as últimas linhas do rastreamento.fonte
Eu acho essencial encontrar o último comando com falha ao ter
set -e
eset -o pipefail
opções, caso contrário, o bash simplesmente é interrompido sem comentários sobre o porquê, então foi o que eu achei funcionando bem:Se você executar o procedimento acima, você verá o tipo de saída abaixo:
O número da linha nem sempre é preciso, mas deve fornecer algo próximo o suficiente para ser útil.
fonte