나는 모든 것을 실행할 수 있기를 원하며 프로그램을 실행하는 대신 실행 파일을 인수로 사용하는 쉘 스크립트를 실행하고 싶습니다. 시스템의 모든 실행 파일을 개별적으로 선택할 필요 없이 이 작업을 수행할 수 있다면 좋을 것입니다.
답변1
경로를 변경하고 모든 실행 파일을 여기에 복사합니다. 여기서 각 실행 파일은 스크립트의 또 다른 이름일 뿐입니다. 그것은 다음과 같습니다:
$ mkdir ${HOME}/shell
$ OLDPATH=$PATH
$ PATH=${HOME}/shell:$PATH
$ echo $PATH | tr : \\n \
| while read P; do (mkdir -p $(echo $P | sed s':/::'); ls $P/* ) \
| while read F; do ln master_script $(echo $F | sed s':/::'); done \
done
지금 써 master_script
. PATH에서 ${HOME}/shell을 제거하고 command -v
실제 경로에 있는 이름을 사용하고 exec
$@를 인수로 전달하도록 합니다.
답변2
스크립트에 정확하게 명령을 보내는 방법은 모르지만 bash 또는 zsh에서는 각 명령 앞에 호출되는 DEBUG 트랩을 사용하여 후크를 추가할 수 있습니다.
자세한 내용은 다음을 참조하세요.https://superuser.com/questions/175799/does-bash-have-a-hook-that-is-run-before-executing-a-command
편집: 명령을 중지하려면 PATH 변수를 변경하여 명령이 실패하도록 할 수 있습니다. 예를 들어:
preexec() {
if [ "$1" = "ls" ] ; then echo STOP; SAVEDPATH="$PATH"; export PATH=/DoesNotExist;
fi
}
preexec_invoke_exec () {
if [ "$SAVEDPATH" != "" ] ; then export PATH="$SAVEDPATH" ; unset SAVEDPATH ; fi;
[ -n "$COMP_LINE" ] && return # do nothing if completing
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
local this_command=`HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//"`;
preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG
date
잘 작동하지만 "명령을 찾을 수 없음"이라는 메시지와 함께 실패하는 유사한 명령을 볼 수 있습니다 ls
. 그러나 이 방법은 echo
.