다른 셸을 통해 모든 명령줄 인수를 어떻게 실행할 수 있나요?

다른 셸을 통해 모든 명령줄 인수를 어떻게 실행할 수 있나요?

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 "$*"

바라보다:

이는 명령줄에 모든 쉘 구문을 포함하는 것을 지원합니다.

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"

관련 정보