Bash 터미널에서 다음 for 루프를 실행하면:
for i in {1..5}; do echo $i; done
이 echo
명령은 현재 쉘의 기록에 추가되지 않습니다. for( do
일부)의 명령이 서브셸에서 실행되기 때문입니까 ? 그렇다면 현재 쉘에서 실행할 수 있는 방법이 있습니까? 아니면 for
당시에는 "실행 중"이었기 때문에 불가능합니까 ?
편집: 전체 for 루프를 하나의 복합 명령으로 처리한다는 점을 감안할 때 for 루프를 제거하고 개별 명령을 5줄에 작성하면 5개 모두 기록에 추가되어야 하지 않습니까?
나는 다음을 수행했습니다.
#!/bin/bash
set -o history
var=5
echo $((var--))
echo $((var--))
echo $((var--))
echo $((var--))
echo $((var--))
실행 스크립트를 사용하십시오 source
. 여전히 역사상 echo $((var--))
5개 모두가 아닌 하나의 echo 문만 표시됩니다. 반면에 5개 대신 , , ... 명령을 5개 echo $((var--))
넣으면 5개 명령이 모두 기록에 추가됩니다.echo 5
echo 4
echo 1
왜?
답변1
$HISTFILE
스크립트를 실행하기 전에 내보내지 않으면 스크립트는 처음에 ~/.bash_history에 기록을 저장하지 않습니다. 말했듯 man bash
이 그 이유는 다음과 같습니다.
HISTFILE이 설정되지 않거나 기록 파일에 쓸 수 없는 경우 기록이 저장되지 않습니다.
HISTFILE
환경 변수가 아니라 쉘 변수이므로 하위 프로세스의 스크립트에서 사용할 수 없습니다. 이 명령을 실행하더라도
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
(프롬프트 뒤의 공백에 유의하세요.) 스크립트가 아닌 대화형 세션에서는 실제로 ~/.bash_history에 저장되지 않습니다. 인기 있는 Linux 배포판(예: Ubuntu)에서는 이를 or( 및 의 별칭) HISTCONTROL
로 설정하여 명령을 저장하기 때문입니다. not을 위해 하나 이상의 공백으로 시작합니다. 이는 다른 사용자와 공유 서버에서 작업하고 특정 명령이 다른 사람이 볼 수 있도록 의도적으로 기록에 저장되는 것을 원하지 않는 경우(예: 해당 명령에 비밀번호나 기타 민감한 정보가 포함되어 있기 때문에) 특히 유용합니다.ignorespace
ignoreboth
ignorespace
ignoredups
그러나 명령 앞에 공백이 없더라도 다음과 같습니다.
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
일반적으로 이전에 포함되거나 언급된 echo $((var--))
대로 ~/.bash_history에는 단 하나의 항목 만 남게 됩니다 . 이들 모두는 시스템에서 호출 할 수 있는 섹션의 Bash 맨페이지에 설명되어 있습니다 .HISTCONTROL
ignoredups
ignoreboth
HISTCONTROL
man bash