
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
스크립트를 실행하기 전에 내보내지 않으면 스크립트는 처음부터 ~/.bash_history에 기록을 저장하지 않습니다 $HISTFILE
. 이것이 말하는 man bash
이유는 다음과 같습니다.
HISTFILE이 설정되지 않거나 기록 파일을 쓸 수 없는 경우 기록이 저장되지 않습니다.
HISTFILE
환경 변수가 아니며 쉘 변수이므로 하위 프로세스인 스크립트에서는 사용할 수 없습니다. 그리고 이 명령을 실행하더라도
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
(프롬프트 뒤의 공백에 유의하십시오.) 스크립트가 아닌 대화형 세션에서는 실제로 ~/.bash_history에 저장되지 않습니다. Ubuntu와 같은 인기 있는 Linux 배포판이 또는 ( 및 의 별칭 ) HISTCONTROL
로 설정되어 있지 않기 때문입니다. 하나 이상의 공백으로 시작하는 명령을 저장합니다. 이는 다른 사용자와 공유 서버에서 작업하고 특정 명령을 다른 사람이 볼 수 있도록 의도적으로 기록에 저장하고 싶지 않은 경우(예: 암호나 기타 민감한 정보가 포함되어 있기 때문에) 특히 유용합니다.ignorespace
ignoreboth
ignorespace
ignoredups
그러나 명령 앞에 공백이 없더라도 다음과 같습니다.
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
일반적
echo $((var--))
으로 앞서 언급한 . 이 모든 내용은 시스템에서 호출할 수 있는 Bash 맨페이지 섹션에 설명되어 있습니다.HISTCONTROL
ignoredups
ignoreboth
HISTCONTROL
man bash