모든 명령을 직접 실행하는 대신 쉘 스크립트를 통해 라우팅하는 방법이 있습니까?

모든 명령을 직접 실행하는 대신 쉘 스크립트를 통해 라우팅하는 방법이 있습니까?

나는 모든 것을 실행할 수 있기를 원하며 프로그램을 실행하는 대신 실행 파일을 인수로 사용하는 쉘 스크립트를 실행하고 싶습니다. 시스템의 모든 실행 파일을 개별적으로 선택할 필요 없이 이 작업을 수행할 수 있다면 좋을 것입니다.

답변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.

관련 정보