Como você usa PIPESTATUS, tee e / bin / sh juntos?

4

Quando eu corro

curl | tee test.txt; echo ${PIPESTATUS[0]}

Eu vejo corretamente

curl: try 'curl --help' or 'curl --manual' for more information

2

Mas quando tento executar exatamente o mesmo comando usando '/ bin / sh':

sh -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"

Eu obtenho

curl: try 'curl --help' or 'curl --manual' for more information

sh: 1: Bad substitution

Como podemos resolver o problema Bad substitution , por favor?

    
por Yasser Zamani 20.01.2014 / 20:25

3 respostas

5

Você resolve isso não usando sh .

A variável PIPESTATUS especificamente e a sintaxe ${var[idx]} matriz em geral, são recursos específicos do shell Bash. Eles não existem no POSIX sh , e até shells que do têm arrays podem usar uma sintaxe diferente.

Acontece que algumas distribuições Linux ligam simbolicamente sua /bin/sh ao Bash. Outras distribuições, no entanto, fazem um link simbólico para dash , o Debian Almquist Shell. Ambos são compatíveis com scripts POSIX sh , mas somente o Bash aceita a sintaxe ${PIPESTATUS[…]} .

Então, se você quiser usá-lo, execute bash -c "…" .

    
por 20.01.2014 / 21:10
3

Workaound para '/ bin / sh' ou busybox

status=0
eval ' { ls /dontexists || echo status="$?"; } | tee /dev/null'
echo "# status=${status}"

Rastreamento:

busybox sh ~/bin/test.sh 
+ status=0
+ ls /dontexists
+ tee /dev/null
ls: /dontexists: No such file or directory
+ echo status=1
+ eval status=1
+ status=1
+ echo # status=1
# status=1
    
por 08.06.2015 / 10:34
1

Além disso, 'bash -c' parece ter um problema com isso quando chamado de tcsh:

bash -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"

PIPESTATUS: Undefined variable.

Isso funciona para mim a partir do tcsh:

bash -c 'curl | tee test.txt; echo ${PIPESTATUS[0]}'

curl: try 'curl --help' or 'curl --manual' for more information
2

GNU bash, versão 4.2.25 (1) -release (x86_64-pc-linux-gnu)
chamado do tcsh 6.17.06

    
por 05.03.2014 / 15:35