터미널 기록을 hist.txt라는 파일에 저장하는 bash 스크립트를 만들려고합니다. 사용 history > hist.txt
은 bash 스크립트에서 작동하지 않는 것 같지만 명령 줄에서 실행될 때 정상적으로 작동합니다.
모든 안내는 대단히 감사합니다.
주디 감사합니다
~/.bash_history
파일을 읽을 수 있습니다.
터미널 기록을 hist.txt라는 파일에 저장하는 bash 스크립트를 만들려고합니다. 사용 history > hist.txt
은 bash 스크립트에서 작동하지 않는 것 같지만 명령 줄에서 실행될 때 정상적으로 작동합니다.
모든 안내는 대단히 감사합니다.
주디 감사합니다
~/.bash_history
파일을 읽을 수 있습니다.
답변:
source
또는로 스크립트를 실행하십시오 .
.
source ./script_name.sh
또는
. ./script_name.sh
후자는 다른 쉘에서 약간 더 호환됩니다.
이 질문은 쉘 스크립트가 자체 컨텍스트에서 실행된다는 중요한 점을 강조합니다. 이것이 무엇을 의미하는지 보려면 다음 쉘 스크립트를 고려하십시오.
#!/bin/bash
cd /
ls
이것을 실행하면 다음과 같은 출력이 나타납니다.
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
그러나 스크립트를 실행 한 후에도 스크립트를 실행하기 전의 디렉토리에 여전히 cd /
있습니다. 스크립트 내부는 실제로 세션에 영향을 미치지 않았습니다. 스크립트가 실행중인 컨텍스트에만 영향을 미쳤습니다. 스크립트가 실행될 수 있도록 생성되고 일단 반환되면 파괴됩니다.
이 source
명령은 '현재 쉘 컨텍스트의 filename 인수에서 명령을 읽고 실행'하므로 cd
내부 와 같은 명령은 현재 세션에 영향을 미칩니다. 위의 스크립트를 전달하여 실행 source
하면 루트 디렉토리가 실행 된 후에 종료됩니다.
이 경우 문제는 history
명령이 현재 쉘 컨텍스트의 히스토리를 제공한다는 것입니다. 스크립트를 사용하지 않고 실행하는 쉘 컨텍스트 source
에는 히스토리가 없으므로 출력 파일에 아무것도 쓰지 않습니다. 사용 source
하면 올바른 컨텍스트에서 실행되고 예상대로 작동합니다.
NB가 : source
쉘 내장되어 아니라 프로그램 자체 - 배쉬에서, source
대명사 .
,하지만 일부 껍질 만이 .
작동합니다 - 내가 사용했던 source
이보다 쉽게 읽을 때문에이 답변에 .
있지만, 최대의 호환성을 위해 .
해야 사용하십시오.
우선, 당신의 역사는 이미 파일에 있습니다. bash를 실행하는 경우 일반적으로 이름은 ~/.bash_history
입니다. 보다 구체적으로, 변수 HISTFILE
를 설정 한 모든 것 입니다. 다른 파일로 복사하려면 다음을 실행하십시오.cat "$HISTFILE" > hist.txt
이제 history
bash 쉘 스크립트에서 명령이 작동하지 않는 이유는 스크립트가 현재 쉘 세션의 비 대화식 자식 쉘에서 실행되기 때문입니다. 자식 셸은 부모의 모든 환경을 상속하지 않으며 (따라서 모든 설정 변수가 아니라) 내 보낸 변수 만 상속합니다. 예를 들어 아래 스크립트는 변수 값을 에코합니다 $var
.
#!/bin/bash
echo "$var"
이제 $var
무언가로 설정 하고 스크립트를 실행하십시오.
$ var="foo"
$ foo.sh
VAR:
다음으로 변수를 먼저 내 보냅니다.
$ var="foo"
$ export var
$ foo.sh
VAR: foo
보시다시피, 변수가 내보내지면 자식 셸에서 변수를 사용할 수 있습니다.
앞에서 언급했듯이 이력은 변수가 가리키는 파일에 저장됩니다 $HISTFILENAME
. 기본적으로 내보내지지 않기 때문에 스크립트를 실행할 때 설정되지 않습니다.
$ cat foo.sh
#!/bin/bash
echo "HISTFILE: $HISTFILE"
$ ./foo.sh
HISTFILE:
$ echo $HISTFILE
/home/terdon/.bash_history
위의 예에서 볼 수 있듯이 변수 HISTFILE
는 일반 쉘 세션에서 설정되지만 스크립트를 실행할 때 비어 있습니다.
따라서 기록을 얻으려면 몇 가지 옵션이 있습니다.
기본값 HISTFILE
은 $HOME/.bash_history
입니다. 변경하지 않은 경우 스크립트에서 다음 명령을 실행하면됩니다.
cat "$HOME/.bash_history" > history
$HISTFILE
변수를 스크립트에 전달하면 다음과 cat
같습니다.
#!/bin/bash
cat "$1" > history
위와 같이 저장 foo.sh
하고 다음과 같이 실행하십시오.
./foo.sh "$HISTORY"
변수가 내보내 졌는지 확인하십시오. 이 줄을 ~/.bash_profile
존재하는 ~/.profile
경우 또는 ~/.bash_profile
존재하지 않는 경우 파일에 추가하십시오.
export HISTFILE
그런 다음 로그 아웃했다가 다시 로그인 history > hist.txt
하면 스크립트를 예상대로 실행할 수 있습니다 . 이것은 export VAR
"자식 쉘에 $ VAR을 사용할 수있게" 하기 때문 입니다. 실제로, 이는 HISTFILE
스크립트 실행에 사용하는 비 대화식 쉘이 값을 상속 함을 의미합니다 .
이제는 HISTFILE
설정되지만 스크립트를 실행하는 셸에서 읽지 않았습니다. 따라서 작동하게하려면 history -r
먼저 읽어야합니다 . 전체 스크립트는 다음과 같습니다.
$!/bin/bash
history -r
history > hist.txt
또는 스크립트를 실행하기 전에 수동으로 내보내십시오.
$ export HISTFILE
그러나 여전히 history -r
스크립트에 있어야합니다 .
@ p0llard 's answer에서source
제안한대로 할 수 있습니다 .