저는 최근 Fish Shell을 사용하기 시작했습니다.
echo $EDITOR
반품vim
그런데 에디터를 실행시켜서 EDITOR
환경변수에서 찾아보아야 하는 프로그램을 사용하면 아무 것도 나오지 않는 것 같습니다.
사용할 때의 예로서 pass edit
(fromhttps://www.passwordstore.org/) 그것은 반환
vi: command not found
(env 변수에 아무것도 설정되지 않은 경우 vi를 대체 수단으로 사용합니다 EDITOR
)
내가 놓친 게 무엇입니까?
답변1
일부 프로그램은 $VISUAL
환경 변수보다 환경 변수를 먼저 찾으 $EDITOR
므로 둘 다 설정된 경우 $VISUAL
해당 변수가 우선 적용됩니다.
또한 쉘 변수는 쉘 언어의 변수입니다. EDITOR=preferred-editor
해당 명령에서 명령을 호출 해야 합니다.환경그들이 그것을 선택하게 해주세요.
쉘은 일부 변수를 환경 변수에 매핑한 다음 이러한 변수를 var=value
실행하는 모든 명령에 대한 환경으로 전달할 수 있습니다. rc
-like 쉘 에서는 다음과 같이 수행됩니다.모두Bourne과 같은 쉘에서는 쉘 변수가 사용됩니다 export var
. 쉘에서는 환경 변수를 설정할 csh
수 있습니다 setenv var value
. 다음 옵션을 fish
사용 합니다 .-x
set
> set var value
> echo $var
value
> printenv var
>
$var
쉘 변수가 설정되었지만 에 전달 var=value
된 환경으로 내보내지지 않았습니다 printenv
.
> set -x var value2
> echo $var
value2
> printenv var
value2
이번에는 그것이 수신된 맥락에서 printenv
하나를 얻습니다 .var=value2
printenv
표준 명령은 아니지만 일반적입니다. env
은 표준 명령이므로 시스템에 없는 경우 다음을 printenv
시도해 볼 수 있습니다.
env | grep -E '^(VISUAL|EDITOR)='
그러나 변수에 var=<newline>VISUAL=
와 같은 값이 있거나 그보다 큰 값이 있으면 LINE_MAX
속일 수 있습니다 .
다른 옵션은 다음과 같습니다.
perl -le 'print $ENV{VISUAL}'
python -c 'import os; print(os.getenv("VISUAL"))'
var=value
또한 여기의 시나리오는 극히 드물지만 var
주어진 환경에 대해 여러 명령을 사용하여 명령을 실행할 수 있습니다.
예를 들어, 다음을 수행할 수 있습니다.
execve("/path/to/cmd", ["cmd", "some arg"], ["VISUAL=vi", "VISUAL=emacs"])
cmd
환경 변수가 갖는 것으로 간주되는 값은 VISUAL
수신하는 환경 변수 목록을 검색하는 방법에 따라 달라집니다 exceve()
. 일부 명령/라이브러리(예: libc
's getenv()
)는 첫 번째 명령을 선택하고 일부 명령/라이브러리는 마지막 명령을 선택합니다. 일부 쉘은 이들 중 하나를 해당 환경 변수에 매핑하지만 다른 하나는 유지하고 추가 실행 시 전달할 수 있습니다.
그래서 당신은 할 수 있고 set -x VISUAL vim
, 두 가지 모두로 실행되고 첫 번째 것만 수정하기 때문에 두 번째 것도 제공한다는 것을 printenv
알 수 있습니다 .emacs
fish
VISUAL=vi
VISUAL=emacs
VISUAL
printenv
하지만 이를 위해서는 적극적으로 사용자를 속이려고 하는 무언가 또는 누군가가 필요하며 자세히 조사해 보면 fish
실제로 환경에서 중복 항목을 제거하는 쉘 중 하나인 것으로 보입니다(있는 경우).