Bash
將帶有雙引號的參數從一個 bash 腳本傳遞到另一個
像這樣呼叫 bash 腳本:
$./script 25 "str1 str2"
它應該啟動一個終端,該終端執行另一個接收兩個參數的腳本,與上面的完全一樣(包括引號)。我試過這個:
lxterminal --command=$"./script2 "$"$@"
但這似乎省略了引號,因此呼叫最終會為
./script2 25 str1 str2
. 複製原始命令行中的參數的正確符號是什麼?
問題是
lxterminal
‘s的參數--command
只是一個字元串,它不能像其他一些終端一樣接受命令及其參數xterm
。
lxterminal
使用自己的規則解析該字元串以確定執行其參數的命令。這與 Bourne shell 解析類似但不完全相同。它確實將
'...'
強引號和空格辨識為參數分隔符,因此您可以為它實現引用:lxquote() { awk -v q="'" ' function lxquote(s) { gsub(q, q "\\" q q, s) return q s q } BEGIN { for (i = 1; i < ARGC; i++) { printf sep "%s", lxquote(ARGV[i]) sep = " " } }' "$@" }
並呼叫
lxterminal
為:lxterminal --command="$(lxquote ./script2 "$@")"
或者,如果
script
的解釋器是bash
,您可以執行以下操作:printf -v code '%q ' ./script2 "$@" CODE=$code lxterminal --command="bash -c 'eval \"\$CODE\"'"