이것은 분명히 SSCCE이므로 (그 자체로는) 의미가 없습니다. 예를 들어 Y
, 이 최소 예제에서는 변수 할당이 사용되지 않습니다. 저는 단지 실제 상황에 맞는 올바른 구문을 찾으려고 노력하고 있습니다.
Bash 쉘에서 직접 다음을 수행할 수 있습니다.
Y=10 echo foo
bash 파일에 다음을 포함할 수도 있습니다 foo.sh
.
#!/bin/bash
X="echo foo"
$X
...그런 다음 다음을 실행합니다.
$./foo.sh
foo
그러나 bash 파일에 다음이 있는 경우:
#!/bin/bash
X="Y=10 echo foo"
$X
...그러면 다음과 같은 결과가 나옵니다.
$ ./foo.sh
./foo.sh: line 3: Y=10: command not found
위의 올바른 구문은 무엇입니까?
답변1
문제는 선택적 매개변수 할당이 인식된다는 점입니다.앞으로매개변수 확장이 발생하므로 라인
$X
이전 할당이 없는 명령으로 인식됩니다. 확장된 결과의 첫 번째 단어가 명령 이름이라고 가정하므로 쉘은 Y=10
.
일반적으로 코드를 변수에 저장하지 말고 함수에 저장해야 합니다.
X () {
Y=10 echo foo
}
답변2
아래에서 설명하는 내용은 사용된 부분을 생략한 최소한의 예시의 인공물임이 밝혀졌습니다 Y
.
이 줄의 명령 앞에는 변수 할당이 나옵니다.
Y=10 echo foo
Y
이 할당은 실행 중에 변수를 로 설정합니다 . 사용되지 않으므로 할당이 적용되지 않습니다.10
echo foo
echo foo
Y
이는 질문과 답변에 있는 이 명령의 모든 변형에서 동일합니다. Y=10
거기에는 아무런 효과가 없습니다.
답변3
이 작업을 수행해야 하는 경우 다음을 사용하세요 env
.
$ X='env Y=10 echo foo'
foo
...그리고 보여줘 $Y
...
$ X='env Y=10 env'
$ $X | grep \^Y
Y=10
...하지만 기능은 더 좋습니다.
답변4
매개변수 확장이 발생한 후 명령을 다시 구문 분석하는 방법은 다음과 같습니다.
X="Y=10 echo foo"
eval "$X"
나는 당신이 이 일을 하고 싶어하는 현실적인 이유가 있다고 가정합니다.