명령 대체 사용을 정당화하는 문제/패턴은 무엇입니까?

명령 대체 사용을 정당화하는 문제/패턴은 무엇입니까?

저는 Drupal/WordPress 애플리케이션을 실행하는 DigitalOcean과 같은 "자체 관리형 셸" 호스팅 제공업체에서 Ubuntu와 Bash를 사용하여 일부 서버 환경을 구축했습니다.

이번에는 소위 "명령 대체".

나는 Bash 프로그래머가 이 개념의 "패턴"을 사용해야 한다면 어떤 문제가 발생하는지 물었습니다. 예를 들어주세요.

답변1

명령 대체는 쉘 명령을 실행하고 그 출력을 변수에 저장하거나 echo 명령을 사용하여 다시 표시하는 것을 의미합니다. 예를 들어 날짜와 시간을 표시하려면 다음을 수행하세요.

echo "Today is $(date)"

내 명령이 다른 명령이나 예제의 출력을 인수로 받을 때 유용합니다.

답변2

~에서POSIX 표준의 명령 대체 섹션:

명령 대체를 사용하면 명령 이름 자체를 명령의 출력으로 바꿀 수 있습니다.

명령 대체를 사용하면 명령 출력을 먼저 임시 파일에 쓴 다음 해당 파일에서 읽지 않고도 편리한 방법으로 사용할 수 있습니다. 이는 명령의 출력이 한 줄의 짧은 문자열인 경우에 가장 적합합니다.

어떤 사람들은 출력이 여러 줄로 된 문서일지라도 명령의 출력을 수집하기 위해 명령 대체를 사용합니다. 이것은 일반적으로아니요명령 대체를 사용하는 좋은 방법입니다. 대신 파이프나 임시 파일을 사용하여 처리 단계 간에 데이터를 전달하는 표준 Unix 관용구를 사용하세요.


내가 사용하는 명령 대체의 예:

예를 들어, 현재 사용자가 루트로 스크립트를 실행하고 있는지 확인하려면 다음을 수행하십시오.

if [ "$( id -u )" -ne 0 ]; then
   echo 'This script requires root privileges, re-run with sudo' >&2
   exit 1
fi

명령 대체는 현재 사용자의 UID(정수)를 반환하는 의 $(id -u)출력을 대체합니다 .id -u

다른 예시. 커밋 에 서명하기 위해 GnuPG를 사용하고 있습니다 git. GnuPG가 제대로 작동하려면 GPG_TTY대화형 셸의 초기화 파일에 현재 터미널 장치의 이름을 설정해야 합니다. 나는 이것을 함께한다

export GPG_TTY="$( tty )"

이는 쉘 세션의 현재 터미널 장치 위치에 따라 다릅니다 GPG_TTY./dev/ttyp4

다른 예시. 특별한 경우에 Solaris 시스템에서 실행해야 하는 스크립트가 있습니다.

case "$( uname -s )" in
    SunOS)
        # code specific for Solaris
        ;;
    *)
        # code for all other Unix platforms
esac

다른 예시. 이 getconf PATH명령은 현재 시스템의 "기본 경로"를 반환합니다. 나는 특정 상황에서 PATH변수를 "일반 기본값" 값으로 재설정하기 위해 이것을 사용했습니다 :

PATH="$( getconf PATH )"

답변3

나는 그것을 자주 사용합니다 find. 예를 들면 다음과 같습니다.

tar cvf ../junk.tar `find .`

또한 가난한 사람의 IDE의 일부로 다음과 같습니다.

vi `grep mysearcstring *.[ch]`

위는 명령줄 예시입니다. 나는 또한 내 스크립트에서 그것을 많이 사용하고 그것 없이는 어려움을 겪을 것입니다. 아마도 가장 일반적인 경우는 위에서 언급한 대로 명령 출력에서 ​​셸 변수를 설정하는 것입니다.

NOW=`date`

나는 백틱을 사용하는 오래된 습관을 따르고 있지만 $(command)하나의 백틱을 다른 백틱 안에 삽입할 수 있으므로 구문이 훨씬 더 좋습니다. 백틱을 사용하면 이스케이프 문자를 어디에 넣어야 하는지 알아야 하는데 \이는 번거롭습니다.

답변4

이 사용법을 필요로 하는 구현 패턴은 Unix 쉘이 하위 프로세스에서 내장되지 않은 모든 명령을 실행한다는 것입니다. 하위 프로세스는 상위 프로세스의 컨텍스트를 수정할 수 없습니다. 명령 대체로 인해 쉘은 마치 쉘 스크립트에 작성되었거나 명령행에 입력된 것처럼 내장되지 않은 명령의 텍스트 출력을 사용하게 될 수 있습니다.

관련 정보