특정 명령의 결과로 환경 변수를 만드는 방법은 무엇입니까? 특히 $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과 같은 쉘에서는 다음을 만들 수 있습니다.환경변수는 다음과 같이 표시됩니다.껍데기export
export
내장 유틸리티를 사용하여 속성과 함께 변수를 내보냅니다(쉘이 실행할 명령 환경으로 내보낼 수 있도록).
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")"
$BWD
foo
대신에 포함됩니다 $'foo\n\n'
.
대신 기본 이름을 얻기 위해 쉘 내장 연산자를 사용할 수 있습니다. 모든 POSIX 유사 셸(zsh 포함) 에서 이는 모든 POSIX 유사 셸(zsh 포함)에서 ( tail의 경우) 를 zsh
사용하여 수행할 수 있습니다 .$PWD:t
t
${PWD##*/}
/
$PWD
$PWD
그러나 만약 그렇다면, 다른 결과가 나올 것입니다 /
. 이 경우, 그러나 basename
반환되거나 빈 문자열로 확장됩니다 . 이와 같은 디렉토리 (보통 자신을 제외하고는 while으로 끝나지 않음 )의 경우 while은 다시 빈 문자열을 제공합니다./
${PWD##*/}
$PWD:t
/foo/bar/
$PWD
/
/
basename
$PWD:t
bar
${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)"
반환 할 수 있습니다 . 따라서 귀하의 사용 사례는 다음과 같습니다.command
foo
$ BWD="$(basename "$PWD")"