Question Comment utilisez-vous PIPESTATUS, tee et / bin / sh ensemble?


Quand je cours

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

Je vois bien

curl: essayez 'curl --help' ou 'curl --manual' pour plus d'informations

2

Mais quand j'essaie d'exécuter exactement la même commande avec '/ bin / sh':

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

Je reçois

curl: essayez 'curl --help' ou 'curl --manual' pour plus d'informations

sh: 1: Mauvaise substitution

Comment pouvons-nous résoudre Bad substitution problème, s'il vous plaît?


4
2018-01-20 19:25


origine


Duplicata possible de Comment obtenir à la fois PIPESTATUS et la sortie en script bash - jww
@jww, les font travailler via sh -c "<your above link answer's scripts here>"? - Yasser Zamani


Réponses:


Vous le résolvez en n'utilisant pas sh.

le PIPESTATUS variable spécifiquement, et le ${var[idx]}  tableau la syntaxe en général, sont des fonctionnalités spécifiques au shell Bash. Ils n'existent pas dans POSIX sh, et même des obus faire avoir des tableaux peuvent utiliser une syntaxe différente.

Il arrive juste que certaines distributions Linux mettent en lien leurs /bin/sh à Bash. D'autres distributions, cependant, le lient à tiret, Debian Almquist Shell. Les deux sont compatibles avec POSIX sh scripts, mais seul Bash accepte les ${PIPESTATUS[…]} syntaxe.

Donc, si vous voulez l'utiliser, lancez bash -c "…" au lieu.


5
2018-01-20 20:10



Parce que sa partie de la question à utiliser sh. Mieux répondre ci-dessous, avec un hack. Pas une meilleure "solution", cependant (je conviendrai qu'une meilleure solution est d'éviter sh) - Dr Beco


Solution de travail pour '/ bin / sh' ou busybox

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

Trace:

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

3
2018-06-08 08:34





De plus, bash -c semble avoir un problème avec l'appel de tcsh:

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

PIPESTATUS: variable indéfinie.

Cela fonctionne pour moi de tcsh:

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

curl: essayez 'curl --help' ou 'curl --manual' pour plus d'informations
  2

GNU bash, version 4.2.25 (1) -release (x86_64-pc-linux-gnu)
appelé depuis tcsh 6.17.06


1
2018-03-05 14:35