당신의 질문을 읽을 때, 나의 첫 생각은 $SHLVL
입니다. 그런 다음 쉘 레벨 외에도vim
레벨
을 계산하려고한다는 것을 알았습니다 . 이를 수행하는 간단한 방법은 쉘 함수를 정의하는 것입니다.
vim() { ( ((SHLVL++)); command vim "$@");}
명령 SHLVL
을 입력 할 때마다 자동으로 자동 증가 합니다 vim
. 지금까지 사용했던 vi
/의 각 변형에 대해이 작업을 수행해야 vim
합니다. 예를 들어
vi() { ( ((SHLVL++)); command vi "$@");}
view() { ( ((SHLVL++)); command view "$@");}
외부 괄호 세트는 서브 쉘을 작성하므로 값을 수동으로 변경해도 SHLVL
현재 (상위) 쉘 환경이 오염되지 않습니다. 물론 command
키워드는 함수가 자신을 호출하지 못하게하기 위해 있습니다 (무한한 재귀 루프가 발생합니다). 물론 이러한 정의를 사용자 .bashrc
또는 다른 쉘 초기화 파일에 넣어야 합니다.
위의 내용에는 약간의 비 효율성이 있습니다. 당신이 말하면 일부 껍질 (bash는 하나임)
( cmd 1 ; cmd 2 ; … ; cmd n )
여기서 외부, 실행 프로그램 (즉,하지 내장 명령), 쉘 그냥 기다릴, 주위에 거짓말을 별도의 프로세스를 유지하다 종료하는. 이것은 (반드시) 필요하지 않습니다. 장점과 단점은 논쟁의 여지가 있습니다. 약간의 메모리와 프로세스 슬롯을 묶지 않고 (및 할 때 필요한 것보다 하나 이상의 쉘 프로세스를 보려는 경우 ) 위의 작업을 수행하고 다음 섹션으로 건너 뜁니다. 여분의 프로세스를 막지 않는 쉘을 사용하는 경우 Ditto. 그러나 추가 프로세스를 피하려면 먼저 시도해보십시오.cmdn
cmdn
ps
vim() { ( ((SHLVL++)); exec vim "$@");}
exec
명령은 느린에서 여분의 쉘 프로세스를 방지 할 수있다.
그러나 문제가 있습니다. 쉘의 처리 SHLVL
는 다소 직관적입니다. 쉘이 시작되면 SHLVL
설정되어 있는지 확인합니다 . 설정되지 않은 경우 (또는 숫자가 아닌 다른 것으로 설정된 경우), 쉘은 1로 설정합니다 (설정된 경우), 쉘은 1을 추가합니다.
그러나,이 논리에 의해, 당신이 말한다면 exec sh
, 당신은 SHLVL
올라갈 것이다. 그러나 실제 쉘 레벨이 증가하지 않았기 때문에 바람직하지 않습니다. 쉘은
당신이 할 때 하나 를 빼서 이것을 처리 SHLVL
합니다 exec
:
$ echo "$SHLVL"
1
$ set | grep SHLVL
SHLVL=1
$ env | grep SHLVL
SHLVL=1
$ (env | grep SHLVL)
SHLVL=1
$ (env) | grep SHLVL
SHLVL=1
$ (exec env) | grep SHLVL
SHLVL=0
그래서
vim() { ( ((SHLVL++)); exec vim "$@");}
세척이다; SHLVL
다시 감소시키기 위해서만 증가 합니다. vim
함수의 이점없이 그냥 말할 수도 있습니다 .
참고 :
Stéphane Chazelas (모든 것을 아는 사람)에 따르면 일부 쉘은 하위 쉘에있는 경우이 작업을 수행하지 않을 만큼 똑똑 exec
합니다.
이 문제를 해결하려면
vim() { ( ((SHLVL+=2)); exec vim "$@");}
그런 다음 쉘 레벨과 독립적으로vim
레벨
을 계산하려는 것을 알았습니다 . 음, 똑같은 마술이 효과가 있습니다 (사소한 수정으로).
vim() { ( ((SHLVL++, VILVL++)); export VILVL; exec vim "$@");}
(그래서 들어 vi
, view
등)가 export
있기 때문에 필요한 VILVL
기본적 환경 변수를 정의하지 않는다. 그러나 함수의 일부일 필요는 없습니다. export VILVL
별도의 명령 ()으로 말할 수 있습니다 .bashrc
. 여분의 쉘 프로세스가 당신이 할 수있는 당신을 위해 문제가되지 않는 경우, 상술 한 바와 같이, command vim
대신 exec vim
, 떠나 SHLVL
혼자 :
vim() { ( ((VILVL++)); command vim "$@");}
개인 취향 :
이름 VILVL
을 같은 것으로 바꾸고 싶을 수도 있습니다 VIM_LEVEL
. " VILVL
"를 보면 눈이 아파요. 그들은 그것이 "비닐"의 철자가 틀린지 또는 잘못된 로마 숫자인지 알 수 없다.
SHLVL
대시를 지원하지 않는 쉘 (예 : 대시)을 사용하는 경우 쉘이 시작 파일을 구현하는 한 직접 구현할 수 있습니다. 그냥 뭔가를
if [ "$SHELL_LEVEL" = "" ]
then
SHELL_LEVEL=1
else
SHELL_LEVEL=$(expr "$SHELL_LEVEL" + 1)
fi
export SHELL_LEVEL
귀하 .profile
또는 해당 파일에. ( SHLVL
지원하는 쉘을 사용하기 시작하면 혼돈을 일으킬 수 있으므로 아마도 이름을 사용하지 않아야 합니다 SHLVL
.)
다른 답변은 환경 변수 값을 쉘 프롬프트에 포함시키는 문제를 해결 했으므로 반복하지는 않겠습니다. 특히 이미 그 방법을 알고 있다고 말하고 싶습니다.
$SHLVL
찾고 있는 변수 (여러 쉘에서 유지 관리)입니까?