Quando digito echo "${PATH}" | tr -s ':' '\n' | nl
de dentro de um script bash e no terminal recebo o mesmo resultado:
1 /home/nikhil/Documents/Git/Cs/Architecture/bin
2 /home/nikhil/.local/bin
3 /home/nikhil/opt/.nvm/versions/node/v16.13.0/bin
4 /home/nikhil/opt/bin
5 /usr/local/sbin
6 /usr/local/bin
7 /usr/sbin
8 /usr/bin
9 /sbin
10 /bin
11 /usr/games
12 /usr/local/games
13 /snap/bin
14 /home/linuxbrew/.linuxbrew/bin
15 /home/linuxbrew/.linuxbrew/sbin
16 /home/nikhil/.cargo/bin
17 /home/nikhil/.cabal/bin
18 /home/nikhil/opt/go/bin
19 /home/nikhil/.ruby/bin
20 /home/linuxbrew/.linuxbrew/opt/fzf/bin
Mas quando digito o seguinte dentro de um script bash e no terminal, recebo resultados diferentes:
# From Terminmal
$ type pandoc
pandoc is aliased to `/usr/bin/pandoc'
pandoc is /usr/bin/pandoc
pandoc is /home/linuxbrew/.linuxbrew/bin/pandoc
pandoc is /home/nikhil/.cabal/bin/pandoc
# From inside bash script
pandoc is /usr/bin/pandoc
Por que type
tem saída diferente de dentro do bashscript e do terminal? Como posso fazer com que a type
saída do script bash seja a mesma do terminal?
Parece que você fez um
type
alias paratype -a
. Os aliases não são herdados por nenhum script de shell executado em seu terminal, e os scripts são executados no modo não interativo por padrão.Como os scripts são executados em um shell não interativo,
~/.bashrc
não serão originados quando o bash executar o script, portanto, os aliases definidos não serão carregados.Sem
-a
,type
irá "indicar como ele seria interpretado se usado como um nome de comando" - ou seja, ele mostrará o que realmente seria executado. Com-a
, ele mostrará todas as correspondências possíveis - executáveis em$PATH
(diretos e por meio de links simbólicos), aliases, funções)por exemplo, no meu sistema,
grep
é alias:Meus aliases não são herdados se eu executar
type
em uma instância (não interativa) do bash:Se eu forçar o bash a ser executado no modo interativo, ele será
source ~/.bashrc
(o que, por sua vez, origina meu~/.bash-aliases
arquivo).OBSERVAÇÃO: não é uma boa ideia apenas fazer com que seus scripts sejam usados
bash -i
como intérprete. Em vez disso, defina quaisquer aliases ou funções necessárias em seu script no próprio script ou obtenha-os de outro arquivo. Ou apenas use o comando com as opções necessárias no script - os aliases são uma conveniência para minimizar a digitação repetitiva, o que não é realmente necessário em um script. BTW,type
a-P
opção de geralmente é a opção mais útil em um script.Veja
help type
: