Bash
Here-document 在 shell 腳本上無法正常工作
我有兩個文件:
server.sh
並且client.sh
,伺服器將以下文本發送到客戶端client.sh
porta_cliente=5678 porta_servidor=8765 nc -l $porta_cliente | sh
server.sh
porta_cliente=5678 porta_servidor=8765 nc $ip $porta_cliente <<-EOF dialog --stdout --backtitle 'Bem vindo ao SEPA 0.1' --title 'Menu inicial' --menu 'Escolha uma opção:' 0 0 0 \ Cadastrar 'Criar um novo usuário' \ Entrar 'Fazer login com sua conta' \ Sair 'Encerrar o SEPA' > logservidor # WORKING FINE UNTIL HERE! case `cat logservidor` in "Cadastrar") echo "LOG: case is being executed" > /dev/tcp/"$ip"/"$porta_servidor" dialog --stdout --msgbox 'CADASTRAR' 0 0 > /dev/tcp/"$ip"/"$porta_servidor" ;; "Entrar") echo "LOG: case is being executed" echo "LOGIN SELECIONADO" > /dev/tcp/"$ip"/"$porta_servidor" ;; "Sair") echo "LOG: case is being executed" echo "SAIR SELECIONADO" > /dev/tcp/"$ip"/"$porta_servidor" ;; esac EOF
如您所見,伺服器通過 netcat 向客戶端發送文本(解釋為多行命令),在這些命令上,我試圖將使用者輸入傳遞給特定文件,然後使用 case 語句檢查使用者輸入是否
Cadastrar
,Entrar
或者Sair
,第一個對話框部分工作正常,但case 'cat log servidor' in
沒有被執行(即使bash -x server.sh
我找不到導致這個問題的原因)
您的
dialog
命令,其輸出被重定向到文件logservidor
,正在遠端端執行。但是應該讀取其輸出的行:case `cat logservidor` in
…正在本地執行,同時建構here-document。這是因為 here-documents 在定義時會執行各種擴展,包括命令替換。
您可以通過引用延遲此擴展(以便僅在執行腳本時發生)
EOF
:nc $ip $porta_cliente <<-"EOF"
但這也會延遲腳本中變數的擴展,例如
$ip
. 如果您希望這些變數立即展開,但cat
命令稍後執行,您可以轉義反引號:case \`cat logservidor\` in
在嘗試發送和執行它之前,您還可以通過查看最終命令來自己調試問題。將第一行替換為
cat > tmp-doc <<-EOF
然後進去
tmp-doc
看看有什麼東西會送過來nc
。