PS1 변수를 통해 쉘 프롬프트를 사용자 정의하는 방법을 검색하는 동안 사용할 수 있는 특수 문자 표를 보았습니다. 특히:
\! the history number of this command
\# the command number of this command
!523
"히스토리 번호"가 더 일반적으로 사용되는 것 같고 redo History 명령과 같은 명령을 사용하는 방법을 알고 있습니다 . 그런데 "명령번호"에도 비슷한 기능이 있는지는 모르겠습니다. PS1 변수를 넣어봤는데 \#
특정 세션에 입력된 명령의 개수가 출력되는 것 같습니다( 와 달리 \!
로그아웃/종료 후에도 지속됩니다).
"명령 번호"를 편리하고 의미 있게 사용하는 방법을 아는 사람이 있나요?
답변1
fc
내가 아는 한(그리고 이것은 귀하의 연구에 의해 확인된 것 같습니다) 해당 매직 넘버를 대화식으로 또는 지름길 없이 참조할 수 있는 방법은 없습니다 !n
. 물론 이것들은 특정 쉘이 시작된 이후의 상대 위치가 아닌 기록 목록의 절대 위치만을 참조하는 것 같습니다( \#
정확하게 지적했듯이 이는 무엇을 참조하고 있는지입니다).
이 문제를 개선하기 위해 제가 찾은 유일한 방법은 다음을 설정하는 것입니다.
export HISTFILESIZE=1001
export HISTSIZE=-1
그런 식으로:
- 새 세션의 기록은 처음부터 시작되므로
1000
세션에서 현재 위치를 더 쉽게 식별할 수 있습니다. - (다소 관련 없음) 특정 세션에서 이전 기록을 잃지 않습니다(그러나 여전히 파일이 넘치지는 않습니다).
기본적으로 다음에서 수정된 프롬프트( )를 가져옵니다 PS1="\\!$ "
.
499$
도착하다:
1000$
...처음에는 좀 더 깔끔해졌습니다. 하지만 이것은 당신이 원하는 답이 아닐 수도 있습니다. :)
(그런데, 나는 또한 해결책을 찾기 위해 zsh를 살펴보았는데 동등한 것이 전혀 없는 것 같아서 \#
그것도 도움이 되지 않습니다.)
답변2
Bash 명령 번호는 표시 전용입니다.
첫째, 몇 가지 배경bashref
:
명령 번호와 기록 번호는 일반적으로 다릅니다. 명령의 기록 번호는 기록 목록의 위치이며, 여기에는 기록 파일에서 복원된 명령이 포함될 수 있습니다(*Bash 기록 기능 참고::). 반면 명령 번호는 현재 쉘에서의 위치입니다. 세션 실행 중 명령 시퀀스의 위치입니다.
소스 속으로 들어가 보세요.parse.y
'\#'
전역 정적 변수로 해석되는 것을 볼 수 있습니다 current_command_number
.
case '#':
n = current_command_number;
/* If we have already incremented current_command_number (PS4,
${var@P}), compensate */
if (orig_string != ps0_prompt && orig_string != ps1_prompt && orig_string != ps2_prompt)
n--;
temp = itos (n);
goto add_string;
목적은 단 하나입니다:eval.c
, 이는 명령을 실행할 때 증가됩니다.
# ...
current_command_number++;
executing = 1;
stdin_redir = 0;
execute_command (current_command);
유지되는 것은 단지 숫자일 뿐 실제 명령이나 이에 상응하는 역사적 숫자도 아닙니다. 따라서 각 명령이 실행될 때 bash는 어떤 명령이 어떤 명령 번호와 연관되어 있는지 잊어버리고 참조를 표시하고 스크롤하는 것 외에는 명령 번호를 사용할 수 없게 만듭니다.