bash 스크립트가 있다고 가정해 보겠습니다 /home/me/test/sh
.
#!/bin/bash
# cmd # here is the output of the cmd
pwd echo 'aaa' # /home/me
val=pwd echo 'aaa' # aaa
val=pwd echo 'aaa'$val # aaa
val=pwd echo 'aaa' && echo $val # aaa <and an empty line>
공백으로 구분된 bash 코드가 어떻게 작동하는지 잘 모르겠습니다.
그런데 방금 ROS를 설치하고 setup.sh
bash라는 스크립트를 생성했는데, 이 스크립트를 읽고 있어서 이런 질문을 드립니다. 다음과 같은 줄이 있습니다.
CATKIN_SHELL=bash /opt/ros/kinetic/_setup_util.py >> file.log
답변1
그래서 여기서 혼란스러운 것은 명령 형식인데, 여기서 명령의 첫 번째 단어는 변수 할당입니다(쉘은 존재 여부에 따라 결정합니다 =
) .
이러한 경우 쉘은 이러한 할당을 평가하지만오직실행 중인 명령에서 이러한 변수를 내보냅니다. 특히 쉘 자체는 이러한 변수에 액세스할 수 없습니다.
이는 환경 변수의 영향을 받는 명령이나 스크립트를 실행하는 데 유용합니다. 이 경우 셸로 내보낼 필요가 없으며 단일 실행을 위해 "일회성"으로 만들기만 하면 됩니다.
명령을 분석하고 하나씩 설명하겠습니다.
pwd echo 'aaa' # /home/me
좋아요, 그러면 pwd
명령을 실행하고 두 개의 인수 echo
와 를 전달합니다 aaa
. 하지만 pwd
인수를 허용하지 않으므로 해당 두 개를 무시하고 로컬 디렉터리를 인쇄합니다.
val=pwd echo 'aaa' # aaa
설명했듯이 이는 변수 할당을 수행하고 $val
문자열을 포함하도록 설정한 pwd
다음 echo
인수를 사용하여 명령을 실행합니다 aaa
. $val
사용 가능한 변수오직echo
쉘 자체가 아닌 명령 에 ! 이 echo
명령은 실제로 변수에 대해 아무 작업도 수행하지 않으므로 aaa
명령이 완료된 후 $val
변수는 다음과 같이 인쇄됩니다 .아니요쉘에 정의되어 있습니다.
val=pwd echo 'aaa'$val # aaa
다시 위의 명령과 유사합니다. 결승전이 $val
확대될 것으로 예상할 수 있기 때문에 조금 까다롭습니다 . 하지만 변수는 커졌다쉘을 통해, 명령을 통하지 않고. 그리고 설명했듯이 쉘은 $val
어느 것이 로 설정되어 있는지 실제로 보지 않고 pwd
명령(이 경우 echo
)만 확인하므로 $val
위와 똑같이 빈 문자열로 확장됩니다.
val=pwd echo 'aaa' && echo $val # aaa <and an empty line>
또 다른 경우에는 $val
첫 번째 명령이 완료된 후에는 사용할 수 없으므로 echo
두 번째 명령은 전체 실행 중에 실제로 셸 자체에 설정되지 않기 echo $val
때문에 아무것도 인쇄하지 않습니다(빈 줄만 표시) .$val
셸에서 설정 하려면 $val
명령 없이 할당을 독립형으로 만들어야 합니다. 예를 들어, 이는 위의 동작과 다릅니다.
$ val=pwd; echo 'aaa' && echo $val
aaa
pwd
val=pwd
뒤에 one 이 오기 때문에 ;
쉘은 이를 자체 명령으로 처리하고 $val
현재 쉘에 설정되므로 echo $val
예상대로 작동합니다.
val=pwd; ...
( 여기에도 차이점 $val
이 있습니다 echo
.아니요val=pwd echo ...
변수를 사용하는 동안 해당 환경에서 변수 보기회의내보냈지만 이 경우 셸에서는 사용할 수 없습니다. )
사용하고 있다는 pwd
점을 고려하여 해당 명령의 출력을 변수에 저장하고 싶은지 궁금합니다.쉘 명령 대체$(
, 백틱을 사용하거나 명령을 및 로 묶는 것이 더 좋습니다 )
.
마지막 예는 다음과 같습니다.
$ val=$(pwd); echo 'aaa' && echo $val
aaa
/home/me
또는:
$ val=$(pwd) && echo 'aaa' && echo $val
aaa
/home/me
(여기에는 미묘한 차이가 있습니다. pwd
후자는 교체 내부 명령(이 경우)이 실패하고 0이 아닌 상태로 종료되는 경우 실행을 중단하며, 이 경우 다음 명령은 실행되지 않습니다 ;
. 그렇지 않은 경우 첫 번째 명령이 실패하더라도 다음 명령이 실행됩니다.)
이 명령에 대해 이해하지 못한 부분이 설명되기를 바랍니다.
답변2
다음 코드는 이 구성의 작동 방식을 이해하는 데 도움이 될 수 있습니다.
$ cd tmprun/
$ cat run.sh
echo $a
$ ./run.sh
$ a=bla ./run.sh
bla