Bash 스크립트는 다음과 같이 호출됩니다.
$./script 25 "str1 str2"
위와 정확히 동일한(따옴표 포함) 두 개의 인수를 받는 다른 스크립트를 실행하는 터미널을 시작해야 합니다. 나는 이것을 시도했습니다 :
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\"'"