배쉬 :“역사 번호”대“명령 번호”


11

인터넷 검색에서 PS1 변수를 통해 쉘 프롬프트를 사용자 정의하는 방법에 사용할 수있는 특수 문자 표가 표시됩니다. 특히:

          \!     the history number of this command
          \#     the command number of this command

"역사 번호"가 더 일반적으로 사용되는 것 같습니다. 나는 !523역사에서 명령을 다시 실행하는 것과 같은 명령을 사용하는 방법을 알고 있습니다. 그러나 "명령 번호"가 비슷한 기능을 가지고 있는지 알 수 없습니다. \#PS1 변수를 넣으려고했는데 특정 세션에 입력 된 명령 수를 출력하는 것 같습니다 (와 달리 \!로그 아웃 / 종료 후에도 지속됨).

누구나 "명령 번호"를 편리하거나 의미있는 방법으로 사용하는 방법을 알고 있습니까?


2
내가 알 수 있듯이,이 "명령 번호"는 입력 한 명령의 수를 알려주는 한 귀중한 것입니다. 역사 확장과 같이 대화식으로이 숫자를 사용하는 방법을 찾을 수 없습니다
Lagrangian

1
흥미로운 질문입니다. 그 의견에 대한 답변을하시면 투표 해 드리겠습니다.
Peter Cordes

답변:


1

Bash의 명령 번호는 표시 전용입니다.

먼저, 일부 배경 bashref:

명령 번호와 히스토리 번호는 일반적으로 다릅니다. 명령의 히스토리 번호는 히스토리 파일에서 복원 된 명령을 포함 할 수있는 히스토리 목록에서의 위치입니다 (* note Bash History Facilities : :). 현재 쉘 세션 동안 실행 된 명령 순서에서의 위치.

소스 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;                                                            

다른 용도로만 사용됩니다 : in eval.c, 명령을 실행할 때 증가합니다.

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

유지되는 것은 실제 명령이나 동등한 이력 번호가 아닌 숫자입니다. 따라서 bash는 각 명령을 실행할 때 명령 번호와 관련된 명령을 잊어 표시 및 스크롤 참조 이외의 다른 명령 번호를 사용할 수 없게합니다.


5

내가 알 수있는 한 (그리고 이것은 당신의 연구에 의해 확인 된 것처럼 보입니다), 그 마법 번호를 대화식으로 또는 참조 fc또는 !n바로 가기 로 참조 할 수있는 방법이 없습니다 . 그것들은 확실히이 특정 쉘이 시작된 이래로 상대적인 위치가 아닌, 히스토리리스트의 절대 위치만을 참조하는 것 같습니다 ( \#올바로 지적했듯이 참조해야합니다).

내가 이것을 더 좋게 만드는 유일한 방법은 다음을 설정하는 것입니다.

export HISTFILESIZE=1001
export HISTSIZE=-1

그런 식으로:

  1. 새 세션 기록이에서 시작되어 세션의 1000현재 위치를 쉽게 식별 할 수 있습니다.
  2. (어떤 관련이없는) 주어진 세션에서 오래된 역사를 잃지 않습니다 (그러나 여전히 파일을 넘치지 않습니다)

기본적으로 수정 된 프롬프트 ( PS1="\\!$ ")를 다음에서 설정했습니다.

499$ 

에:

1000$ 

... 시작시 조금 더 깨끗합니다. 그러나 그것은 아마도 당신이 찾고있는 대답이 아닐 것입니다. :)

(그런데, 나는 또한 해결책을 찾기 위해 zsh를 보았고 단순히 그것과 동등한 \#것이 없기 때문에 전혀 도움이되지 않습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.