히스토리 파일 조작 스크립트를 만들려고 합니다.
예를 들어 다음을 실행하여 시크릿 모드를 구현하려고 하면
unset HISTFILE
명령이 새 셸에서 실행되므로 아무런 효과가 없습니다. 내가 시도할 때
. ./script
명령은 작동하지만 스크립트에 전달된 매개변수를 처리하는 데 사용하는 조건으로 인해 구문 오류가 발생합니다.
해결책이 있나요?
해결됨: 문제는 잘못된 조건부 사용 및 zsh 스크립트의 비호환성이었습니다.
case $1 in
(set)
HISTFILE=$2
HISTFILESIZE=$3
;;
(incognito)
unset HISTFILE
;;
(removesizelimit)
HISTSIZE=-1
HISTFILESIZE=-1
;;
(clear)
rm -f $HISTFILE
unset HISTFILE && exit
;;
(backup)
tar -cf HISTFILE.tar $HISTFILE
;;
("")
echo "Usage:"
echo " . ./history <option>"
echo " . ./history set <HISTSIZE> <HISTFILESIZE>"
echo
echo "Manipulate history file"
echo
echo "Options:"
echo -e " incognito\t\t\tdo not record history of commands in this session"
echo -e " removesizelimit\t\tremove limitation of size of history file"
echo -e " clear\t\t\t\tclear history of run commands"
echo -e " backup\t\t\t\tclear create a backup of history file in archive"
;;
(*)
echo "ERROR: Option unrecognized"
echo
echo "run . ./history for help"
esac
답변1
이 답변의 대부분은 질문이 편집되기 전에 더 의미가 있었습니다. :)
오류는 간단합니다.
if [ "$1" == "proto" ]; then
TESTVAR=
if [ "$1" == "set" ]; then
HISTFILE=$2
HISTFILESIZE=$3
elif [ "$1" == "incognito" ]; then
# ....
여기서 두 번째는 if
이어야 합니다 elif
. bash
일치하는 항목이 없어서 불평합니다 fi
.
이 스크립트에 관해 언급하고 싶은 두 가지 사항이 더 있습니다.
unset
이것은 하위 쉘에서 실행되고 원하는 것이 아닌 명령의 출력을 실행합니다 .$(unset HISTFILE)
$(...)
연산자를 제거 해야 합니다 .이는
#!/bin/bash
스크립트가 바이너리에 대한 인수로 독립적으로 실행될 수 있음을 의미합니다/bin/bash
. 이는 이와 같은 스크립트에는 적합하지 않으므로 수행하지 않는 것이 좋습니다(그리고 실행 권한을 설정하지 않는 것이 좋습니다).
마지막 한가지. 중첩된 if/else를 통한 매개변수 구문 분석은 약간 서투릅니다. 다음 명령문 을 사용할 수 있습니다 case
.
case $1 in
(proto) TESTVAR= ;;
(set)
HISTFILE=$2
HISTFILESIZE=$3
;;
#...etc...
("")
# ... put your usage here...
;;
(*)
echo >&2 "ERROR: Option unrecognized"
echo >&2
echo >&2 "run . ./history.bash for help"
;;
esac
zsh에서 스크립트가 작동하도록 설정합니다.
- 의 사용법을
==
로 바꾸십시오=
. 이==
연산자는 이 연산자에 대한 비표준 별칭이며=
이는 중단되는 경우 중 하나입니다. HISTFILESIZE
다음으로 이름 바꾸기SAVEHIST