tempenv
다음과 같이 사용하고 싶은 스크립트가 있습니다 .
$ tempenv ls -l
tempenv
다음과 같습니다.
#!/bin/bash
setarch ... /bin/bash -c $@
그러나 예상대로 작동하지 않습니다. 대신 첫 번째 인수만 실행하고 다른 인수는 무시합니다. tempenv ls -l
처럼 달리고 있었습니다 tempenv ls
.
답변1
man bash
:
-c
-c 옵션이 있는 경우 옵션이 아닌 첫 번째 인수 command_string에서 명령을 읽습니다. command_string 뒤에 인수가 있는 경우 첫 번째 인수는 $0에 할당되고 나머지 인수는 위치 인수에 할당됩니다. $0에 대한 지정은 경고 및 오류 메시지에 사용되는 쉘의 이름을 설정합니다.
tempenv () { bash -c 'set -x; : "$@"' foo "$@"; }
tempenv ls -l 'foo bar'
+ : ls -l 'foo bar'
따라서 이것은 당신에게 도움이 될 것입니다:
#!/bin/bash
setarch ... /bin/bash -c '"$@"' tempenv-subshell "$@"
답변2
셸의 -c
옵션은 명령줄을 인수로 사용하여 두 개로 $@
나눕니다 ls -l
. (동일합니다 "$@"
. 단, 인수 문자열에 공백이 그대로 남아 있으므로 직접적인 도움이 되지 않습니다.)
따라서 실제 명령줄을 전달하려는 경우 스크립트에 문자열만 전달한 다음 를 사용하여 전달 sh -c "$1"
하거나 원하는 경우 스크립트의 모든 매개변수를 문자열로 연결한 다음 를 사용하면 sh -c "$*"
됩니다.
#!/bin/bash
setarch ... /bin/bash -c "$*"
바라보다:
- (Bash) 쉘의 특수 매개변수/변수는 무엇입니까?
- https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html
이는 명령줄에 모든 쉘 구문을 포함하는 것을 지원합니다.
tempenv 'ls -l; echo $SOMEVAR'
tempenv '[ some test ] && echo true'
그러나 반면에 공백이 포함된 파일 이름과 같이 공백을 포함해야 하는 매개변수는 두 번 인용해야 합니다.
tempenv 'ls -l "Some Document.txt"'
답변3
tempenv
스크립트를 다음과 같이 호출한다고 가정합니다 tempenv ls -l
. 즉, 명령 이름과 해당 명령에 대한 인수라는 두 개의 인수를 전달하면 실제로 원하는 것처럼 들립니다.
#!/bin/sh -
exec setarch ... "$@"
즉, tempenv
다양한 아키텍처에서 주어진 매개변수를 사용하여 주어진 명령을 실행하려고 합니다.
일부 쉘이 다른 아키텍처에서 일부 코드를 해석하도록 하려면 선택한 쉘 tempenv 'ls -l'
에서 해석되는 코드라고 부를 수 있습니다. ls -l
코드는 다음과 같습니다:
#! /bin/sh -
if [ "$#" -ne 1 ]; then
printf >&2 '%s\n' "Usage: $0 <code-in-bash-language>"
exit 1
fi
bash_code=$1
exec setarch ... /bin/bash -c -- "$bash_code"