사용자 정의 zsh 스크립트를 자동으로 실행 가능하게 만드는 방법은 무엇입니까?

사용자 정의 zsh 스크립트를 자동으로 실행 가능하게 만드는 방법은 무엇입니까?

이 작업을 수행하는 방법에 대해 매우 간단한 내용이 누락되었겠지만 간단한 스크립트가 있습니다.

extract () {
  if [ -f $1 ] ; then
    case $1 in
      *.tar.bz2)   tar xvjf $1    ;;
      *.tar.gz)    tar xvzf $1    ;;
      *.tar.xz)    tar xvJf $1    ;;
      *.bz2)       bunzip2 $1     ;;
      *.rar)       unrar x $1     ;;
      *.gz)        gunzip $1      ;;
      *.tar)       tar xvf $1     ;;
      *.tbz2)      tar xvjf $1    ;;
      *.tgz)       tar xvzf $1    ;;
      *.zip)       unzip $1       ;;
      *.Z)         uncompress $1  ;;
      *.7z)        7z x $1        ;;
      *.xz)        unxz $1        ;;
      *.exe)       cabextract $1  ;;
      *)           echo "\'$1': unrecognized file compression" ;;
    esac
  else
    echo "\'$1' is not a valid file"
  fi
}

스크립트는 작동하지만 로그인할 때 기본적으로 실행할 수 없는 것 같습니다.

나는 이 매우 철저한 답변을 찾았습니다.zsh에서 자신만의 쉘 함수를 정의하고 로드하는 방법, 그리고 함수를 저장하는 해당 디렉터리를 표시하기 위해 $fpath를 가져왔습니다.

내 .zshrc 구성 파일의 맨 아래에 추가한 것이 fpath=( ~/.local/bin "${fpath[@]}" )내 기능이 있는 경로입니다.

이것을 입력하면 다음과 같은 결과 echo $fpath가 나타납니다.

/home/me/.local/bin /home/me/.oh-my-zsh/plugins/git /home/me/.oh-my-zsh/functions /home/me/.oh-my-zsh/completions ...

autoload -Uz extract하지만 로그인할 때마다 명시적으로 입력하지 않으면 작동하지 않습니다.

로그인할 때 전체 디렉토리를 자동으로 로드할 수 있는 방법이 있습니까?

답변1

스크립트와 함수를 혼동하고 있습니다.

스크립트 만들기

스크립트는 독립적인 프로그램입니다. zsh로 작성될 수도 있지만 zsh 명령줄뿐만 아니라 어디에서나 호출할 수 있습니다. zsh 명령줄이나 다른 zsh 스크립트에서 zsh로 작성된 스크립트를 실행하는 경우 이는 우연일 뿐이며 스크립트 동작에 영향을 미치지 않습니다. 스크립트는 자체 프로세스에서 실행되며 상위 프로세스에 영향을 주지 않습니다(예: 변수나 현재 디렉터리를 변경할 수 없습니다).

코드는 어디에서나 호출할 수 있고 실행 중인 셸의 상태에 액세스할 필요가 없는 독립적인 작업을 수행하므로 함수가 아닌 스크립트여야 합니다.

스크립트는 실행 파일이어야 합니다. chmod +x /path/to/script.it는 다음으로 끝나야 합니다.셰르본 라인커널에 스크립트를 해석하는 데 사용할 프로그램을 알려주십시오. 귀하의 경우 파일 상단에 다음 줄을 추가하십시오.

#!/usr/bin/env zsh

변수에 나열된 디렉토리에 파일을 배치합니다 $PATH. 많은 시스템이 사용자 기본값으로 설정되어 있으므로 ~/bin사용할 수 있습니다. 추가 디렉터리를 추가하려면 다음을 참조하세요.~/.local/binPATHhttp://unix.stackexchange.com/questions/26047/how-to-Correctly-add-a-path-to-path

별명, 함수 또는 내장 명령이 아닌 명령 이름을 입력하면 쉘은 해당 이름의 실행 파일을 찾아서 $PATH실행합니다. 따라서 스크립트를 쉘에 선언할 필요 없이 올바른 위치에 배치하기만 하면 됩니다.

함수를 만들어 보세요

함수는 기존 셸 인스턴스 내에서 실행되는 코드입니다. 변수, 현재 디렉터리, 함수, 명령 기록 등 모든 쉘 상태에 대한 전체 액세스 권한을 갖습니다. 호환되는 셸에서만 함수를 호출할 수 있습니다.

코드는 함수로 작동하지만 함수로 만들어도 아무 것도 얻을 수 없으며 다른 곳(예: 파일 관리자)에서 코드를 호출하는 기능을 잃게 됩니다.

zsh에서는 함수의 정의 를 ~/.zshrc. .zshrc자동 로딩은 두 단계로 이루어집니다.

  1. 함수 이름을 선언하는 데 사용됩니다 autoload -U myfunction.
  2. myfunction처음 호출 되면 zsh는 myfunction나열된 디렉토리에서 이름이 지정된 파일을 찾고 $fpath찾은 첫 번째 파일을 myfunction.

모든 기능은 사용하기 전에 정의되어야 합니다. 그렇기 때문에 파일 을 $fpath.autoload$fpath

% autoload -U myfunction
% which myfunction
myfunction () {
        # undefined
        builtin autoload -XU
}

Zsh에는 탐색을 통해 이러한 스텁을 생성하는 메커니즘이 있습니다 $fpath. 이는 완료 하위 시스템에 포함되어 있습니다.

  • 놓다#autoload파일의 첫 번째 줄로.
  • 완성 시스템 초기화 함수를 호출하기 전에 .zshrc완전히 설정되었는지 확인하세요 .fpathcompinit

함수 정의가 포함된 파일에는 함수가 포함되어야 합니다., 함수의 정의가 아닙니다. zsh는 함수를 호출할 때 파일의 내용을 실행하기 때문입니다. 따라서 코드를 함수에 넣으려면 다음을 포함하는 extract디렉토리 중 하나에 있는 이라는 파일에 코드를 넣으십시오.$fpath

#autoload
if [ -f $1 ]; then

함수가 로드될 때 초기화 코드를 실행하거나 도우미 함수를 정의하려는 경우 이 관용구(zsh 배포판에서 사용됨)를 사용할 수 있습니다. 보조 정의 및 기타 초기화 코드와 함께 함수 정의를 파일에 저장합니다. 마지막으로 함수를 호출하고 매개변수를 전달합니다. 그러면 다음이 myfunction포함됩니다:

#autoload
my_auxiliary_function () {
}
myfunction () {
}
myfunction "$@"

폴리스티렌

7z x대부분의 아카이브 유형에서 작동합니다.

답변2

이 문제를 해결하는 방법에는 여러 가지가 있습니다.

  • 이 기능을 .zshrc에 넣을 수 있습니다.
  • 스크립트를 얻을 수 있습니다.
  • 함수에 대한 코드를 다음과 같은 파일에 직접 배치할 수 있습니다.정제PATH의 디렉터리에 있습니다.

관련 정보