일반적으로 bash는 명령의 출력을 여러 줄에 걸쳐 배포할 수 있습니다.
L=`ls`
이는 대화형 쉘 및 스크립트에서 작동합니다. 하지만 내장 함수의 출력을 변수로 캡처할 수 없는 것 같습니다.
L=`dirs -l -p`
이는 대화형 셸에서 작동하지만 스크립트에서는 첫 번째 줄만 변수로 끝납니다. 아마도 bash의 내장 함수 처리 방식이 다르기 때문일 것입니다.
왜 이런 일이 발생하며 필요한 작업을 어떻게 수행할 수 있습니까?
답변1
질문하신 내용에 다소 모호한 부분이 있는 것 같습니다. 당신은 말한다:
그러나 스크립트에서는 첫 번째 줄만 변수로 끝납니다.
그러면 귀하의 의견은 스크립트가 아닌 쉘 함수를 작성하고 있음을 나타냅니다.
cd
나는 스크립트의 어떤 것도 상위 쉘에 전파되지 않기 때문에 디렉토리를 변경하는 데 스크립트가 쓸모가 없다는 것을 알고 있다고 생각합니다 . 스크립트에서 디렉터리 변경 프로그램을 개발하려고 하면 디렉터리 스택이 다음과 같기 때문에 어려움에 봉착하게 됩니다.아니요슬레이브 쉘에 의해 상속됨:
$ dirs -l
/home/msw /home/msw/Ubuntu One /home/msw /usr/bin /usr/local /bin /usr/local
$ cat > dirs.sh
dirs -l
$ bash dirs.sh
/home/msw
도움이 되는 기능을 얻을 수 있습니다:
$ function passdirs() { bash ndirs.sh `dirs -l -p`; }
$ cat > ndirs.sh
echo $#
echo "$@"
$ passdirs
8
/home/msw /usr/local /usr/bin /bin /usr/local /usr/bin /bin /home/msw
그러나 물론 cd
현재 셸 내에서 작동하려면 함수가 필요합니다. 이 경우 명령줄을 통해 인수를 래핑하고 래핑 해제하는 것은 인용문을 인용 해제하는 일이므로 이 모든 작업을 함수에서 수행하는 것이 더 나을 것입니다.
$ function cd_pattern() {
cd $(dirs -l -p | grep --max-count=1 -e "$1") ; dirs
}
$ dirs
~ /usr/local /bin /usr/share/doc/evince ~/Ubuntu One
$ cd_pattern v..c
/usr/share/doc/evince /usr/local /bin /usr/share/doc/evince ~/Ubuntu One
$(...)
또한 인용 혼란을 줄이기 위해 역따옴표(backtick)의 동의어로도 사용됩니다 .
답변2
명령의 출력은 대화식으로 실행되는지 아니면 스크립트 내에서 실행되는지에 따라 달라질 수 있습니다. 예를 들어 "다중 라인 출력"은 다음에 적용됩니다 export
.
#! /bin/bash
L=`export`
echo "$L"
, 대화형으로 실행할 때와 동일한 출력을 제공합니다.
하지만 아니요 alias
, 이것은 당신에게 아무것도 주지 않습니다.