errore di sintassi vicino al token imprevisto “< '

Sono scrivere uno script per leggere loutput di un comando nella variabile a e b. Questo è lo script

#!/bin/bash read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) echo "The value of a is $a" echo "The value of b is $b" 

e ottiene lerrore di sintassi come:

line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)" 

Ma quando digito lo stesso comando nella console funziona senza problemi.

app@user:/tmp> read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) app@user:/tmp> echo $a FAILED app@user:/tmp> echo $b STARTED 

Qualsiasi aiuto su questo è davvero apprezzato.

Commenti

  • Non sono in grado di riprodurre questo comportamento dallo script. Come stai invocando lo script? Sto invocando come: $ ./script.sh
  • @Ketan Lo sto invocando come sh script.sh. Proprio ora ho provato a utilizzare ./script.sh e sta dando il risultato desiderato. Il valore di a è FAILED Il valore di b è STARTED. Grazie mille per la risposta … Voglio solo sapere perché è diverso durante lesecuzione dello stesso script usando sh file.sh e ./file.sh ??
  • Supponi sh don ' t consentire la sostituzione del comando. Prova a richiamare con bash script.sh. La stessa chiamata di ./script.sh viene eseguita con sha-bang che è / bin / ** bash ** nel tuo script.
  • @SudevJash vedi: Qual è la differenza tra ./ e sh per eseguire uno script?
  • @Costas Sì, funziona bene anche con bash script.sh e sto ottenendo loutput desiderato … Grazie mille …

Risposta

sh (che nella maggior parte dei sistemi (derivati da Debian) è collegato a dash) non “consente la sostituzione del processo . Prova a invocare con bash script.sh. La stessa chiamata di ./script.sh viene eseguita con sha-bang che è /bin/bash nel tuo script.

Commenti

  • @MichaelDurrant Ah, la tua modifica ora significa lopposto di quello che volevo dire.
  • @muru Non posso ' accettare la modifica t o bash. Intendo esattamente dash. file $(which sh) output /bin/sh: symbolic link to 'dash'
  • Costas, questo ' è quello che ho significava. Michael Durrant ha cambiato la mia modifica per sostituire dash con bash. Grazie per aver risolto il problema.
  • Intendi la sostituzione del processo (<( echo foo )), non la sostituzione del comando ($(echo foo)) (che fa parte della specifica POSIX).
  • @chepner Hai ragione. Grazie per il commento. Riparato.

Risposta

Stavo cercando di richiamare lo script come sh file.sh e ho ricevuto lerrore . Ma quando ho invocato lo stesso script di ./file.sh e bash file.sh funziona e dà il risultato desiderato.

Risposta

Inoltre, puoi semplicemente aggiungere la riga sotto nella parte superiore dello script:

#!/bin/bash 

Indica al tuo terminale / console di eseguire lo script come script bash, e la sostituzione del tuo processo “<( cmd )” funzionerà bene.

Commenti

  • Nota che lo script dellOP ' aveva già quello shebang, ma lOP era in esecuzione come sh file.sh anziché file.sh o ./file.sh (vedi la propria risposta )

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *