Încerc să redirecționez stderr către stdout și apoi să intru într-un fișier într-un script init, dar când introduc stderr în stdout obțin eroarea „Redirecționare ambiguă de ieșire”. Stdout singur nu duce la eroare și scrie în fișierul jurnal unde am menționat. Am „încercat următoarele

-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 & 

Orice sfat ar fi apreciat.

Comentarii

Răspuns

Dacă rulați (t) csh, primiți Ambiguous output redirect. dacă încercați să configurați două redirecționări conflictuale:

> echo foo > a > b Ambiguous output redirect. 

În Bash, ați putea primi o eroare similară dacă utilizați o matrice cu mai multe elemente în locul numelui fișierului:

$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect 

După cum se menționează în răspunsurile la redirecționarea stderr nu funcționează în csh , operatorul >& funcționează în (t) csh pentru a redirecționa atât stdout, cât și stderr. 2>&1 este modalitatea standard de a redirecționa stderr în același loc cu stdout, dar (t) csh nu acceptă acest lucru. În schimb, este nevoie de combinația > foo 2>&1 ca redirecționare către foo, un argument regulat 2 și o redirecționare către 1, iar redirecționările sunt în conflict, astfel încât să primiți eroarea.

>& funcționează și în Bash și zsh, dar nu este o caracteristică standard.

Răspuns

A doua intrare ar trebui să funcționeze bine. Eroarea „redirecționare ambiguă” apare uneori dacă aveți spații în care nu ar trebui să fie, sau invers când lipsește un spațiu important.

Aș simplifica comanda dvs. pentru a demonstra:

echo "Test" >/tmp/x.txt 2>&1 & 

Partea „> /tmp/x.txt” va redirecționa stdout (mânerul de fișier # 1). Este permis un spațiu între> și numele fișierului (deși în acest context ar fi confuz), dar altfel nu ar trebui să existe spații aici.

2> & 1 va redirecționa stderr (mânerul de fișier 2) către orice fișier mânerul 1 merge la (care este stdout). Nici aici nu trebuie să existe spații.

& vă va arăta în fundal sarcina. Acest lucru trebuie compensat cu un spațiu din caracterul precedent.

Inversarea celor două redirecționări nu funcționează (deși ecoul este o alegere slabă aici, deoarece nu produce ieșire stderr):

echo "This will not work" 2>&1 >/tmp/x.txt & 

Aceasta înseamnă:

2>&1 

Redirecționează mânerul de fișier 2 către unde merge mânerul de fișiere 1 (care în acest moment este încă consola)

>/tmp/x.txt 

Redirecționează mânerul de fișiere 1 către un fișier – dar de la mânerul de fișiere 2 (stderr) este deja redirecționat în acest moment, își va păstra destinația și va merge în continuare la consolă.

Prima comandă pe care ați scris-o este pur și simplu o eroare de sintaxă.

echo &>/tmp/x.txt 

Actualizare : @Wildcard a subliniat în comentarii că aceasta este de fapt o sintaxă validă.

Comentarii

  • The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.. Poate conține spațiul. command >out.txt == command > out.txt
  • Ai dreptate; Am făcut o greșeală acolo. Remediere.
  • " Prima comandă pe care ați scris-o este pur și simplu o eroare de sintaxă. " Nu, este ' s nu; ' este sintaxa preferată Bash pentru redirecționarea stdout și stderr. Consultați LESS='+/Redirecting Standard Output and Standard Error' man bash
  • @Wildcard – mulțumesc. Nu mă opresc niciodată să învăț!

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *