명령 출력으로 환경 변수를 만드는 방법

명령 출력으로 환경 변수를 만드는 방법

특정 명령의 결과로 환경 변수를 만드는 방법은 무엇입니까? 특히 $PWD의 기본 이름인 환경 변수($BWD)를 원합니다.

$ cd /home/devel/Autils/lib
$ echo $PWD
/home/devel/Autils/lib
$ # something here to assign BWD
$ echo $BWD
lib

답변1

일반적으로 시퀀스는 foo="$(bar)"명령을 실행 bar하고 출력을 변수에 할당합니다.

예를 들어

% echo $PWD
/home/sweh
% BWD="$(basename "$PWD")"
% echo $BWD
sweh

그러면 쉘 변수가 생성됩니다. 만들고 싶다면환경변수(서브쉘에서 볼 수 있음)를 사용할 수 있습니다 export.

예를 들어

export BWD="$(basename "$PWD")"

그러나 이 경우에는 필요하지 않습니다.달리기명령이지만 쉘 변수 확장을 사용함

BWD=${PWD##*/}

답변2

Bourne과 같은 쉘에서는 다음을 만들 수 있습니다.환경변수는 다음과 같이 표시됩니다.껍데기exportexport내장 유틸리티를 사용하여 속성과 함께 변수를 내보냅니다(쉘이 실행할 명령 환경으로 내보낼 수 있도록).

export BWD

쉘 변수에 값을 할당하는 구문은 다음과 같습니다.

BWD=value

이 값을 명령의 출력으로 사용할 수 있습니다.명령 대체. Bourne 쉘에서는 `the-command`구문을 사용 하지만 현대 Bourne과 같은 쉘에서는 선호되는 방법은 다음을 사용하는 것입니다 $(the-command).

BWD=$(the-command)

일반적으로 명령 대체를 방지하려면 따옴표가 필요합니다.분할+전역. 그러나 스칼라 변수에 대한 할당에는 Split+glob이 표시되지 않으므로 여기서는 필요하지 않습니다.

파일 경로의 기본 이름을 가져오는 명령은 command 입니다 basename.

basename "$PWD"

(split+glob이 명령 인수에 나타나기 때문에 따옴표가 필요합니다.)

많은 구현에서 이를 옵션으로 처리하므로 $PWD값이 YMMV로 시작하지 않는 한 에 저장된 파일의 기본 이름을 반환합니다 . 따라서 일반적으로 변수 데이터를 명령에 전달할 때 a를 사용하여 뒤따르는 내용이 다음으로 시작하더라도 옵션으로 처리되지 않음을 명령에 알립니다 (여기서는 매우 병리적인 경우를 제외하고는 항상 로 시작해야 함 ) . 따라서 엄격하게 요구되지는 않습니다).-basename---$PWD/

BWD=$(basename -- "$PWD")
export BWD

최신 쉘에서는 다음 두 가지를 결합할 수 있습니다.

export BWD="$(basename -- "$PWD")"

(일부 구현에서는 명령의 인수로 돌아가기 때문에 일부 구현에서는 따옴표가 필요하지만 일부 다른 구현에서는 export할당과 유사한 인수를 어떤 경우에는 특수한 경우로 구문 분석합니다.)

이 접근 방식의 한 가지 문제점은 's 값이 $PWD개행 문자로 끝나는 경우(실제로는 그럴 가능성이 낮음),명령 대체줄자모두후행 개행 문자. 그래서:

mkdir $'foo\n\n'
cd $'foo\n\n'
export BWD="$(basename -- "$PWD")"

$BWDfoo대신에 포함됩니다 $'foo\n\n'.

대신 기본 이름을 얻기 위해 쉘 내장 연산자를 사용할 수 있습니다. 모든 POSIX 유사 셸(zsh 포함) 에서 이는 모든 POSIX 유사 셸(zsh 포함)에서 ( tail의 경우) 를 zsh사용하여 수행할 수 있습니다 .$PWD:tt${PWD##*/}/$PWD

$PWD그러나 만약 그렇다면, 다른 결과가 나올 것입니다 /. 이 경우, 그러나 basename반환되거나 빈 문자열로 확장됩니다 . 이와 같은 디렉토리 (보통 자신을 제외하고는 while으로 끝나지 않음 )의 경우 while은 다시 빈 문자열을 제공합니다./${PWD##*/}$PWD:t/foo/bar/$PWD//basename$PWD:tbar${PWD##*/}

기본 이름으로 동적으로 확장되는 변수의 경우 다음을 $PWD사용할 수 있습니다.ksh93규율기능:

ksh93미리 basename가지고 있는 한 내장 버전도 있습니다 . 따라서 ksh93에는 다음이 포함됩니다./opt/ast/bin$PATH

$ PATH=/opt/ast/bin:$PATH
$ type basename
basename is a shell builtin version of /opt/ast/bin/basename
$ BWD.get() { .sh.value=${ basename -- "$PWD"; }; }
$ cd /var/log
$ echo "$BWD"
log
$ cd /usr/local
$ echo "$BWD"
local
$ export BWD
$ printenv BWD
local

위에서는 ksh93 특정 형식을 사용했습니다.명령 대체: ${ the-command; }명령을 실행하기 위한 서브쉘 환경을 생성하지 않기 때문에 더 효율적입니다.

bash쉘에 대해서는 다음을 참조하십시오.변수 선언 시 명령 대체 실행 방지일부 방법의 경우.

답변3

이 구성을 사용하여 a의 출력을 변수로 foo="$(command)"반환 할 수 있습니다 . 따라서 귀하의 사용 사례는 다음과 같습니다.commandfoo

$ BWD="$(basename "$PWD")"

관련 정보