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

스크립트를 실행하기 전에 내보내지 않으면 스크립트는 처음부터 ~/.bash_history에 기록을 저장하지 않습니다 $HISTFILE. 이것이 말하는 man bash이유는 다음과 같습니다.

HISTFILE이 설정되지 않거나 기록 파일을 쓸 수 없는 경우 기록이 저장되지 않습니다.

HISTFILE환경 변수가 아니며 쉘 변수이므로 하위 프로세스인 스크립트에서는 사용할 수 없습니다. 그리고 이 명령을 실행하더라도

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

(프롬프트 뒤의 공백에 유의하십시오.) 스크립트가 아닌 대화형 세션에서는 실제로 ~/.bash_history에 저장되지 않습니다. Ubuntu와 같은 인기 있는 Linux 배포판이 또는 ( 및 의 별칭 ) HISTCONTROL로 설정되어 있지 않기 때문입니다. 하나 이상의 공백으로 시작하는 명령을 저장합니다. 이는 다른 사용자와 공유 서버에서 작업하고 특정 명령을 다른 사람이 볼 수 있도록 의도적으로 기록에 저장하고 싶지 않은 경우(예: 암호나 기타 민감한 정보가 포함되어 있기 때문에) 특히 유용합니다.ignorespaceignorebothignorespaceignoredups

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

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

일반적 echo $((var--)) 으로 앞서 언급한 . 이 모든 내용은 시스템에서 호출할 수 있는 Bash 맨페이지 섹션에 설명되어 있습니다.HISTCONTROLignoredupsignorebothHISTCONTROLman bash

관련 정보