Sto provando a reindirizzare stderr a stdout e poi a un file in uno script di inizializzazione, ma quando introduco stderr a stdout ottengo lerrore “Ambiguous output redirect”. Stdout da solo non genera lerrore e scrive nel file di log dove ho dichiarato. Ho “provato quanto segue
-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar &>/jbeaulau_test/microservices/log/all.log & -jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar >/jbeaulau_test/microservices/log/all.log 2>&1 &
Qualche consiglio sarebbe apprezzato.
Commenti
Risposta
Se “stai eseguendo (t) csh, ottieni Ambiguous output redirect.
se provi a impostare due reindirizzamenti in conflitto:
> echo foo > a > b Ambiguous output redirect.
In Bash, potresti ottenere un errore simile se utilizzi un array con più elementi al posto del nome del file:
$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect
Come menzionato nelle risposte a reindirizzamento stderr non funzionante in csh , loperatore >&
funziona in (t) csh per reindirizzare sia stdout che stderr. 2>&1
è il modo standard per reindirizzare stderr nella stessa posizione di stdout, ma (t) csh non lo supporta. Invece, utilizza la combinazione > foo 2>&1
come reindirizzamento a foo
, un argomento normale 2
e un reindirizzamento a 1
e i reindirizzamenti sono in conflitto, quindi viene visualizzato lerrore.
>&
funziona anche in Bash e zsh, ma non è “una funzionalità standard.
Risposta
La seconda voce dovrebbe funzionare bene. Lerrore di “reindirizzamento ambiguo” a volte si verifica se hai spazi dove non dovrebbero “t essere, o viceversa quando manca uno spazio importante.
Semplificherei il tuo comando per dimostrare:
echo "Test" >/tmp/x.txt 2>&1 &
La parte “> /tmp/x.txt” reindirizzerà stdout (file handle n. 1). È consentito uno spazio tra> e il nome del file (sebbene in questo contesto sarebbe fonte di confusione), ma per il resto non dovrebbero esserci spazi qui.
Il 2> & 1 reindirizzerà stderr (file handle 2) a qualsiasi file lhandle 1 va a (che è stdout). Non devono esserci spazi neanche qui.
& farà da sfondo allattività. Deve essere compensato con uno spazio dal carattere precedente.
Linversione dei due reindirizzamenti non funziona (sebbene echo sia una scelta sbagliata in questo caso poiché non produce output stderr):
echo "This will not work" 2>&1 >/tmp/x.txt &
Ciò significa:
2>&1
Reindirizza lhandle di file 2 a dove va lhandle di file 1 (che a questo punto è ancora la console)
>/tmp/x.txt
Reindirizza lhandle di file 1 a un file – ma poiché lhandle di file 2 (stderr) è già reindirizzato a questo punto, manterrà la sua destinazione e andrà comunque alla console.
Il primo comando che hai scritto è semplicemente un errore di sintassi.
echo &>/tmp/x.txt
Aggiornamento : @Wildcard ha sottolineato nei commenti che questa è effettivamente una sintassi valida.
Commenti
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
. Può contenere lo spazio.command >out.txt
==command > out.txt
- Hai ragione; Ho fatto un errore lì. Risolto.
- " Il primo comando che hai scritto è semplicemente un errore di sintassi. " No, ' no; è ' è la sintassi Bash preferita per reindirizzare sia stdout che stderr. Vedi
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @Wildcard – grazie. Non smetto mai di imparare!
echo &> foo
. (2) Non fornire comandi di esempio asincroni se non è necessario. (3) Informazioni sulle conchiglie. Cè più di una shell in Unixverse e accettano sintassi di comando diverse. Scopri come sapere quale shell stai utilizzando.