Se você estiver usando bash: Olhe para o homem páginas via man bashe procurar substituição de comando
Flohe
Respostas:
16
No manual do Bash ( man bash):
Substituição de Comando
A substituição de comando permite que a saída de um comando substitua o
nome do comando Existem duas formas:
$ (comando)
ou
`comando`
O Bash executa a expansão executando o comando em um subshell
ambiente e substituindo a substituição de comando pelo padrão
saída do comando, com as novas linhas finais excluídas. embutido
novas linhas não são excluídas, mas podem ser removidas durante a palavra
dividindo. A substituição do comando $ (arquivo cat) pode ser substituída pelo
equivalente, mas mais rápido, $ (<arquivo).
(Isto é válido para todos Bourne-como conchas, ou seja sh, ksh, zsh, bashetc., e zshtambém é capaz de capturar dados com caracteres NUL incorporados desta forma)
O comando
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
irá atribuir o nome do diretório onde o script está localizado (ao mesmo tempo, mudando todas as barras invertidas em barras) para a variável basedir. Quaisquer erros, avisos ou outras mensagens de diagnóstico enviadas para o fluxo de erros padrão ainda serão exibidos no terminal ( $(...)apenas captura a saída padrão do comando).
O shell começará executando a substituição do comando mais interno:
echo "$0"| sed -e 's,\\,/,g'
A saída disso será fornecida como uma string dirnamee a saída será atribuída à variável basedir.
As aspas duplas existem para garantir que nenhuma divisão de palavras ou globbing de nome de arquivo seja realizada; caso contrário, você pode achar que o script falha ou produz uma saída estranha quando $0(o nome do script, incluindo o caminho usado para executá-lo) contém um espaço caractere ou um caractere globbing do nome do arquivo (como ?ou *).
Em geral, é uma boa ideia sempre citar expansões (expansões variáveis, substituições de comandos e expansões aritméticas). Veja esta pergunta e suas respostas para uma excelente explicação sobre por que essa é uma boa ideia.
Se o script foi executado como
$ /usr/local/bin/script.sh
então basedirobterá o valor de /usr/local/bin.
Ou, no Cygwin:
$ bash c:\\Users\\Me\\script.sh
então basedirobterá o valor de c:/Users/Me. As barras invertidas duplas na linha de comando, neste caso, são apenas para escapar das barras invertidas únicas do shell. O valor real de $0é c:\Users\Me\script.sh.
Outra maneira de fazer a mesma coisa sem usar dirname, echoe sedseria
A varible=$(..)chamada substituição de comando e não significa nada além de executar um comando shell e armazenar sua saída em uma variável ou exibir de volta usando o comando echo. Por exemplo, exiba data e hora:
man bash
e procurar substituição de comandoRespostas:
No manual do Bash (
man bash
):(Isto é válido para todos Bourne-como conchas, ou seja
sh
,ksh
,zsh
,bash
etc., ezsh
também é capaz de capturar dados com caracteres NUL incorporados desta forma)O comando
irá atribuir o nome do diretório onde o script está localizado (ao mesmo tempo, mudando todas as barras invertidas em barras) para a variável
basedir
. Quaisquer erros, avisos ou outras mensagens de diagnóstico enviadas para o fluxo de erros padrão ainda serão exibidos no terminal ($(...)
apenas captura a saída padrão do comando).O shell começará executando a substituição do comando mais interno:
A saída disso será fornecida como uma string
dirname
e a saída será atribuída à variávelbasedir
.As aspas duplas existem para garantir que nenhuma divisão de palavras ou globbing de nome de arquivo seja realizada; caso contrário, você pode achar que o script falha ou produz uma saída estranha quando
$0
(o nome do script, incluindo o caminho usado para executá-lo) contém um espaço caractere ou um caractere globbing do nome do arquivo (como?
ou*
).Em geral, é uma boa ideia sempre citar expansões (expansões variáveis, substituições de comandos e expansões aritméticas). Veja esta pergunta e suas respostas para uma excelente explicação sobre por que essa é uma boa ideia.
Se o script foi executado como
então
basedir
obterá o valor de/usr/local/bin
.Ou, no Cygwin:
então
basedir
obterá o valor dec:/Users/Me
. As barras invertidas duplas na linha de comando, neste caso, são apenas para escapar das barras invertidas únicas do shell. O valor real de$0
éc:\Users\Me\script.sh
.Outra maneira de fazer a mesma coisa sem usar
dirname
,echo
esed
seriafonte
/bin/sh
do Solaris 10 ou anterior) não suportava$(...)
.Significa executar o que está entre parênteses em um subshell e retornar isso como um valor , no seu caso, atribuindo isso a
varible
.fonte
A
varible=$(..)
chamada substituição de comando e não significa nada além de executar um comando shell e armazenar sua saída em uma variável ou exibir de volta usando o comando echo. Por exemplo, exiba data e hora:e para armazená-lo em uma variável:
Para obter mais informações: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
fonte