
+ 또는 + $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
쉘이 $HISTIGNORE
a로 대체된 *
다음 파일 목록으로 대체되기 때문에 확장이 발생하는 것을 볼 수 있습니다.
env | grep HISTIGNORE
두 경우 모두 실행하여 확인할 수 있습니다 . -case 에는 거기가 "
표시되고 do_music.sh
, '
-case에는 가 표시됩니다 *
.
또한 한 디렉토리에 있는 동안 라인을 실행하고 다른 디렉토리에 있는 동안 라인을 실행해 볼 export HISTIGNORE
수 echo
있습니다.'
"
(위 부분은 거짓으로 판명되었기 때문에 삭제했습니다. 작은 따옴표와 큰 따옴표는 *
큰 따옴표 안에 대체되지 않기 때문에 결국 귀하의 경우에 작동해야 합니다.)
업데이트 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 자체가 있는 경우 파일 목록으로 대체됩니다( .
! 로 시작하지 않음). )를 현재 디렉토리에 저장합니다(현재 디렉토리가 비어 있거나 로 시작하는 파일만 포함하고 있는 .
경우는 그대로 *
유지됩니다).