Escrevendo funções zsh que funcionam

0

Eu devo admitir que estou completamente perplexo. Eu tenho tentado e procurando por horas sem sucesso. Eu simplesmente não consigo conciliar zsh e minhas funções pessoais.

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

, bem como os padrões, que não são necessários aqui.

Aqui é onde eu escolhi para colocar minhas funções. Então estamos bem aqui.

/home/terry/.zsh/functions contém os seguintes arquivos

-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

Por favor, note que eu prefixei os arquivos com sublinhados conforme instruído.

Tomando o um do topo da lista

#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
}

Eu tentei com e sem #compdef
Eu tentei com #!/bin/zsh
Na parte superior e abaixo de #compdef
e eu tentei e sem #!/bin/zsh

Não consegui encontrar nada que diga se devo ou não fazer arquivo executável por usuários não-root, então eu tentei como executável e como não executável.

Eu também tentei com e sem o _all-files-to-top () { tanto com e sem o sublinhado.

O programa que chama a função começa com #!/bin/zsh -xv é iniciado diretamente a partir da linha de comando no terminal para depuração

Aqui está a impressão da tela

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% 

Ah, e uma última coisa - ortografia. Eu copiei o nome para o área de transferência e usado 'localizar e substituir' em todos os casos.

Eu realmente não sei mais o que tentar. Poderia algum tipo de alma fornecer um exemplo do mundo real (não foo) de uma função com uma explicação de o que é necessário para que funcione corretamente? Poderia ser algo como o método de codificação usado no script ou função? O meu é 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
    
por Terry 07.02.2017 / 05:07

2 respostas

2

Para que isso funcione, você precisa fazer duas coisas:

  1. Você precisa dizer a zsh que ele deve carregar o script com a função nele. Isso pode ser feito com o comando autoload :

     autoload -Uz FILENAME
    

    Para o seu exemplo, substitua FILENAME por _all-files-to-top

  2. Chame a função pelo nome com o qual ela está definida: Chamar all-files-to-top não funciona porque a função é chamada _all-files-to-top .

    O _ inicial não é removido automaticamente, nem é de modo algum especial. Segundo a convenção, as funções de conclusão (aquelas funções chamadas para gerar completações ao pressionar a tecla Tab ) devem começar com _ para que possam ter nomes significativos sem interferir em nenhum comando. Como isso não parece ser uma função de conclusão, provavelmente não há razão real para aderir a essa convenção. (Além disso, você não precisa de #compdef nesse caso ')

por 07.02.2017 / 15:10
0

Levou horas sangrentas percorrendo um monte de 'não relevante para a minha situação para criar uma função simples com dez pontos para fazer funcionar. Se eu me sentir bem nos próximos dias, vou tentar postar uma solução adequada.

    
por 10.02.2017 / 11:30

Tags