효율적인 zsh 함수 작성

효율적인 zsh 함수 작성

나는 완전히 혼란스럽다는 것을 인정해야 한다. 나는 몇 시간 동안 노력하고 검색했지만 아무 소용이 없었습니다. 나는 zsh를 내 개인적인 기능과 조화시킬 수 없습니다.

$ print -l $fpath
/home/terry/.zsh/functions

기본값과 마찬가지로 여기서는 필요하지 않습니다.

여기에 기능을 배치하기로 선택했습니다. 그래서 우리는 여기서 괜찮습니다.

/home/terry/.zsh/functions다음 파일이 포함되어 있습니다.

-rwxrw-r-- 1 terry terry  274 Feb  6 19:20 _all-files-to-top
-rwxrw-r-- 1 terry terry  253 Feb  6 18:30 _check-for-empty-files
-rwxrw-r-- 1 terry terry  452 Feb  6 18:32 _check-video-duration
-rwxrw-r-- 1 terry terry  302 Feb  6 18:33 _error-1
-rwxrw-r-- 1 terry terry  462 Feb  6 18:34 _error-2
-rwxrw-r-- 1 terry terry  198 Feb  6 18:34 _just-hevc
-rwxrw-r-- 1 terry terry  188 Feb  6 18:36 _just-volume

지시에 따라 파일 앞에 밑줄을 추가했습니다.

목록의 맨 위에서 하나를 선택하세요.

#compdef all-files-to-top
#
_all-files-to-top() {
mkdir duplicate_files
mkdir ~/Replace
#
find . -type f -exec mv -n {} ./ \;
find . -empty -type d -delete
while [ -d * ]; do
array=(find . -type d)
for x in $array ; do mv -t duplicate_files "$x" ; done
find . -name "duplicate_files" -exec mv {} ~Replace
return
}

나는 그것을 가지고 있는 것과 없이 그것을 시도했다 #compdef
나는 그것을 가지고 있는 #!/bin/zsh
것과 없이 #compdef
그것을 시도했다#!/bin/zsh

루트가 아닌 사용자가 파일을 실행 가능하게 만들 것인지에 대한 정보를 찾을 수 없어서 실행 가능한 파일과 실행 불가능한 파일로 시도했습니다.

또한 _all-files-to-top() {을 사용하거나 사용하지 않고 밑줄을 사용하거나 사용하지 않고 시도했습니다.

이 함수로 시작하는 프로그램을 호출하고 #!/bin/zsh -xv 디버깅을 위해 터미널 명령줄에서 직접 시작하세요.

화면 출력물입니다

terry-TP500LA% 2mkv
# /etc/zsh/zshenv: system-wide .zshenv file for zsh(1).
#
# This file is sourced on all invocations of the shell.
# If the -f flag is present or if the NO_RCS option is
# set within this file, all other initialization files
# are skipped.
#
# This file should contain commands to set the command
# search path, plus other important environment variables.
# This file should not contain commands that produce
# output or assume the shell is attached to a tty.
#
# Global Order: zshenv, zprofile, zshrc, zlogin

if [[ -z "$PATH" || "$PATH" == "/bin:/usr/bin" ]]
then
    export PATH="/usr/local/bin:/usr/bin:/bin:/usr/games"
fi
+/etc/zsh/zshenv:15> [[ -z /home/terry/scripts/cron:/home/terry/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin || /home/terry/scripts/cron:/home/terry/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin == /bin:/usr/bin ]]
#!/bin/zsh -xv

top=$(pwd)
+/home/terry/scripts/2mkv:3> top=+/home/terry/scripts/2mkv:3> pwd
+/home/terry/scripts/2mkv:3> top=/home/terry/New_Videos 


# call function
# moves any duplicate files to ~/Replace
mkdir duplicate_files
+/home/terry/scripts/2mkv:8> mkdir duplicate_files
mkdir ~/Replace
+/home/terry/scripts/2mkv:9> mkdir /home/terry/Replace
mkdir: cannot create directory ‘/home/terry/Replace’: File exists
all-files-to-top
+/home/terry/scripts/2mkv:10> all-files-to-top
/home/terry/scripts/2mkv:10: command not found: all-files-to-top

exit 0
+/home/terry/scripts/2mkv:12> exit 0
terry-TP500LA% 

아, 그리고 마지막으로 한 가지 – 철자법입니다. 이름을 클립보드에 복사하고 각 인스턴스에서 찾기 및 바꾸기를 사용했습니다.

나는 무엇을 더 시도해야할지 정말로 모른다. 어떤 친절한 사람이 foo가 없는 함수의 실제 예를 제공하고 작동 방법을 설명할 수 있습니까? 스크립트나 함수에서 사용하는 인코딩 방식과 비슷하지 않을까요? 내 것은 UTF-8입니다.

all-files-to-top
+/home/terry/scripts/2mkv:10> all-files-to-top
/home/terry/scripts/2mkv:10: command not found: all-files-to-top

답변1

이것이 작동하려면 다음 두 가지 작업을 수행해야 합니다.

  1. zsh함수가 포함된 스크립트를 로드해야 한다고 알려주어야 합니다 . 이는 다음 명령을 사용하여 수행할 수 있습니다 autoload.

     autoload -Uz FILENAME
    

    귀하의 예를 FILENAME들어_all-files-to-top

  2. 정의된 함수 이름으로 함수 호출: all-files-to-top함수 이름이 이라 호출이 되지 않습니다 _all-files-to-top.

    시작 부분 _은 자동으로 제거되지 않으며 특별한 내용도 없습니다. 관례상, 완성 함수(완성을 생성하기 위해 눌렀을 때 호출되는 함수 ) 는 명령을 방해하지 않고 의미 있는 이름을 가질 수 있도록 Tab로 시작해야 합니다 . _이는 완성 함수로 보이지 않으므로 이 규칙을 준수할 실제 이유는 없을 것입니다. (또한 #compdef이 경우에는 `가 필요하지 않습니다.)

관련 정보