배쉬 버그?? `$HISTIGNORE` 설정이 `SP`+`*` 또는 `SP`+`?*`로 끝나는 경우

배쉬 버그?? `$HISTIGNORE` 설정이 `SP`+`*` 또는 `SP`+`?*`로 끝나는 경우

+ 또는 + $HISTIGNORE로 끝나도록 설정하면 현재 폴더의 파일 목록이 해당 값에 연결됩니다.SP*SP?*

어떤 문제도 extglob설정되거나 설정 해제되지 않습니다.

NG 예(현재 폴더에는 'do_music.sh' 파일이 하나만 있음):

$ export HISTIGNORE="ls:ls *:history:history *:sudo *"
$ echo $HISTIGNORE
ls:ls *:history:history *:sudo do_music.sh
$

알겠습니다 예:

$ export HISTIGNORE="ls:ls *:history *:sudo *:history"
$ echo $HISTIGNORE
ls:ls *:history *:sudo *:history
$

답변1

업데이트 2

내 원래 답변에 따라 그대로 유지하려면 작은따옴표를 사용해야 합니다 *. 그렇게 하면 변수에는 확장이 아닌 확장 HISTIGNORE만 포함됩니다 . 를 *실행하면 echo쉘이 $HISTIGNOREa로 대체된 *다음 파일 목록으로 대체되기 때문에 확장이 발생하는 것을 볼 수 있습니다.

env | grep HISTIGNORE두 경우 모두 실행하여 확인할 수 있습니다 . -case 에는 거기가 "표시되고 do_music.sh, '-case에는 가 표시됩니다 *.

또한 한 디렉토리에 있는 동안 라인을 실행하고 다른 디렉토리에 있는 동안 라인을 실행해 볼 export HISTIGNOREecho있습니다.'"

(위 부분은 거짓으로 판명되었기 때문에 삭제했습니다. 작은 따옴표와 큰 따옴표는 *큰 따옴표 안에 대체되지 않기 때문에 결국 귀하의 경우에 작동해야 합니다.)

업데이트 3

동작이 발생하는 이유 echo는 bash의 대체 순서 때문입니다. 매뉴얼에 따르면:

       The  order of expansions is: brace expansion; tilde expansion, parameter and vari‐
       able expansion, arithmetic expansion, and command substitution (done in a left-to-
       right fashion); word splitting; and pathname expansion.

먼저 일어나는 일은매개변수/변수확장( $HISTIGNORE으로 변경 *), 그 후에는경로명확장( *파일 목록 변경).

아래의 원래 답변

첫 번째 줄을 실행하면 다음과 같습니다.

export HISTIGNORE="ls:ls *:history:history *:sudo *"

쉘은 이미 마지막 항목을 *디렉토리의 파일 목록으로 확장하므로 do_music.sh해당 위치에 도달하게 됩니다.

eg 라는 이름의 파일이 있는 경우에도 bla:sudo이것 *:sudo으로 대체됩니다. 해당 패턴과 일치하는 파일이 없기 때문에 그렇지 않습니다.

이런 일이 발생하지 않도록 하려면 작은따옴표를 사용하여 대체를 방지해야 합니다 *.

export HISTIGNORE='ls:ls *:history:history *:sudo *'

업데이트

Btw, HISTIGNORE에는 특별한 것이 없습니다. 이는 모든 변수 정의 또는 해당 문제의 모든 명령에 대해 발생합니다. *큰따옴표 안의 어딘가에 a 자체가 있는 경우 파일 목록으로 대체됩니다( .! 로 시작하지 않음). )를 현재 디렉토리에 저장합니다(현재 디렉토리가 비어 있거나 로 시작하는 파일만 포함하고 있는 .경우는 그대로 *유지됩니다).

관련 정보