bash 脚本的调用方式如下:
$./script 25 "str1 str2"
它应该启动一个终端,该终端运行另一个接收两个参数的脚本,与上面的参数完全相同(包括引号)。我试过这个:
lxterminal --command=$"./script2 "$"$@"
但这似乎省略了引号,因此调用最终会成为./script2 25 str1 str2
.复制原始命令行中的参数的正确表示法是什么?
答案1
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\"'"