Bashスクリプトは次のように呼び出されます。
$./script 25 "str1 str2"
上記とまったく同じ(引用符を含む)2つの引数を受け取る別のスクリプトを実行する端末を起動する必要があります。私はこれを試しました:
lxterminal --command=$"./script2 "$"$@"
しかし、これは引用符を省略したように見えるので、呼び出しは元の./script2 25 str1 str2
コマンドラインから引数をコピーする正しい表記法は何ですか?
答え1
lxterminal
問題は、sの引数が単なる--command
文字列であるため、他の端末のようにコマンドとその引数を受け入れることができないことですxterm
。
lxterminal
独自のルールを使用して文字列を解析して、その引数を実行するコマンドを決定します。これは Bourne シェルの構文解析と似ていますが、同じではありません。
パラメータ区切り記号は二重引用符とスペースを認識するので、'...'
次のように引用符を実装できます。
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\"'"