Wie benutzt man PIPESTATUS, tee und / bin / sh zusammen?

4321
Yasser Zamani

Wenn ich renne

curl | tee test.txt; echo $ 

Ich sehe es richtig

curl: Für weitere Informationen versuchen Sie 'curl --help' oder 'curl --manual'

2

Aber wenn ich versuche, exakt denselben Befehl mit '/ bin / sh' auszuführen:

sh -c "curl | tee test.txt; echo \$" 

Ich bekomme

curl: Für weitere Informationen versuchen Sie 'curl --help' oder 'curl --manual'

sh: 1: Schlechter Ersatz

Wie können wir das Bad substitutionProblem lösen ?

4
Mögliches Duplikat von [So erhalten Sie PIPESTATUS und Ausgabe im Bash-Skript] (https://superuser.com/questions/425774/how-to-get-both-pipestatus-and-output-in-bash-script) jww vor 6 Jahren 1
@jww, funktionieren sie über `sh -c""`? Yasser Zamani vor 6 Jahren 0

3 Antworten auf die Frage

5
grawity

Sie lösen es, indem Sie es nicht verwenden sh.

PIPESTATUSSpeziell die Variable und die $ Arraysyntax im Allgemeinen sind für die Bash-Shell spezifische Merkmale. Sie existieren nicht in POSIX sh und sogar Muscheln, die tun Arrays haben möglicherweise eine andere Syntax verwenden.

Es kommt nur vor, dass einige Linux-Distributionen ihre Verknüpfung /bin/shzu Bash herstellen. Andere Distributionen jedoch Symlink es zu schleudern, Debian Almquist Shell. Beide sind mit POSIX- Sh- Skripts kompatibel, aber nur Bash akzeptiert die $Syntax.

Wenn Sie es verwenden möchten, führen Sie es bash -c "…"stattdessen aus.

Weil es ein Teil der Frage ist "sh" zu verwenden. Besser antworten, mit einem Hack. Allerdings keine bessere "Lösung" (Ich stimme zu, dass eine bessere Lösung darin besteht, "sh" zu vermeiden) Dr Beco vor 8 Jahren 0
3
rzr

Problemumgehung für '/ bin / sh' oder busybox

status=0 eval ` { ls /dontexists || echo status="$?"; } | tee /dev/null` echo "# 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 
1
atmchem

Auch 'bash -c' scheint beim Aufruf von tcsh ein Problem zu haben:

bash -c "curl | tee test.txt; echo \$"

PIPESTATUS: Undefinierte Variable.

Das funktioniert für mich von tcsh:

bash -c 'curl | tee test.txt; echo $'

curl: probieren Sie 'curl --help' oder 'curl --manual', um weitere Informationen zu erhalten.
2

GNU bash, Version 4.2.25 (1) -release (x86_64-pc-linux-gnu),
aufgerufen aus tcsh 6.17.06