공백으로 구분된 bash 스크립트 명령

공백으로 구분된 bash 스크립트 명령

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.shbash라는 스크립트를 생성했는데, 이 스크립트를 읽고 있어서 이런 질문을 드립니다. 다음과 같은 줄이 있습니다.

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

관련 정보