Bash for 루프 - 루프의 명령을 셸 기록에 추가할 수 있나요?

Bash for 루프 - 루프의 명령을 셸 기록에 추가할 수 있나요?

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 5echo 4echo 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을 위해 하나 이상의 공백으로 시작합니다. 이는 다른 사용자와 공유 서버에서 작업하고 특정 명령이 다른 사람이 볼 수 있도록 의도적으로 기록에 저장되는 것을 원하지 않는 경우(예: 해당 명령에 비밀번호나 기타 민감한 정보가 포함되어 있기 때문에) 특히 유용합니다.ignorespaceignorebothignorespaceignoredups

그러나 명령 앞에 공백이 없더라도 다음과 같습니다.

$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))

일반적으로 이전에 포함되거나 언급된 echo $((var--)) 대로 ~/.bash_history에는 단 하나의 항목 만 남게 됩니다 . 이들 모두는 시스템에서 호출 할 수 있는 섹션의 Bash 맨페이지에 설명되어 있습니다 .HISTCONTROLignoredupsignorebothHISTCONTROLman bash

관련 정보