AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 429169
Accepted
Ryan Ward
Ryan Ward
Asked: 2018-03-09 22:06:55 +0800 CST2018-03-09 22:06:55 +0800 CST 2018-03-09 22:06:55 +0800 CST

Como tornar o script zsh personalizado executável automaticamente?

  • 772

Devo estar perdendo algo incrivelmente simples sobre como fazer isso, mas tenho um script simples:

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
}

O script funciona, mas não consigo executá-lo por padrão quando faço login.

Eu consultei esta resposta muito completa: Como definir e carregar sua própria função de shell em zsh , e consegui fazer com que meu $ fpath mostrasse o diretório apropriado onde armazenei a função.

Em meu perfil .zshrc, adicionei fpath=( ~/.local/bin "${fpath[@]}" )ao fundo, que é o caminho onde minhas funções residem.

Quando eu insiro echo $fpath, recebo:

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

No entanto, não funciona, a menos que eu digite explicitamente autoload -Uz extracttoda vez que faço login.

Existe uma maneira de fazer com que todo o diretório seja carregado automaticamente quando eu fizer login?

zsh scripting
  • 2 2 respostas
  • 21177 Views

2 respostas

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2018-03-10T03:59:59+08:002018-03-10T03:59:59+08:00

    Você está misturando scripts e funções.

    Fazendo um roteiro

    Um script é um programa autônomo. Pode acontecer de estar escrito em zsh, mas você pode invocá-lo de qualquer lugar, não apenas de uma linha de comando zsh. Se acontecer de você executar um script escrito em zsh a partir de uma linha de comando zsh ou outro script zsh, isso é uma coincidência que não afeta o comportamento do script. O script é executado em seu próprio processo, não influencia seu pai (por exemplo, não pode alterar as variáveis ​​ou o diretório atual).

    Seu código realiza uma tarefa autônoma que pode ser chamada de qualquer lugar e não precisa acessar o estado do shell que o executa, portanto, deve ser um script, não uma função.

    Um script deve ser um arquivo executável: chmod +x /path/to/script. Ele deve começar com uma linha shebang para permitir que o kernel saiba qual programa usar para interpretar o script. No seu caso, adicione esta linha ao topo do arquivo:

    #!/usr/bin/env zsh
    

    Coloque o arquivo em um diretório listado na $PATHvariável. Muitos sistemas configurados ~/binou ~/.local/binno padrão do usuário PATH, então você pode usá-los. Se você deseja adicionar outro diretório, consulte http://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path

    Quando você digita um nome de comando que não é um alias, uma função ou um built-in, o shell procura um arquivo executável com esse nome $PATHe o executa. Assim você não precisa declarar o script para o shell, basta soltá-lo no lugar certo.

    Fazendo uma função

    Uma função é um código executado dentro de uma instância de shell existente. Ele tem acesso total a todos os estados do shell: variáveis, diretório atual, funções, histórico de comandos, etc. Você só pode invocar uma função em um shell compatível.

    Seu código pode funcionar como uma função, mas você não ganha nada tornando-o uma função e perde a capacidade de invocá-lo de outro lugar (por exemplo, de um gerenciador de arquivos).

    No zsh, você pode disponibilizar uma função para sessões interativas incluindo sua definição em ~/.zshrc. Como alternativa, para evitar a confusão .zshrccom um número muito grande de funções, você pode usar o mecanismo de carregamento automático. O carregamento automático funciona em duas etapas:

    1. Declare o nome da função com autoload -U myfunction.
    2. Quando myfunctioné invocado pela primeira vez, o zsh procura um arquivo chamado myfunctionnos diretórios listados em $fpathe usa o primeiro arquivo encontrado como a definição de myfunction.

    Todas as funções precisam ser definidas antes do uso. Por isso não basta colocar o arquivo em $fpath. Declarar a função com autoloadrealmente cria uma definição de stub que diz “carregue esta função $fpathe tente novamente”:

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

    O Zsh tem um mecanismo para gerar esses stubs explorando arquivos $fpath. Está embutido no subsistema de conclusão.

    • Coloque #autoloadcomo a primeira linha do arquivo.
    • Em seu .zshrc, certifique - se de definir totalmente fpathantes de chamar a função de inicialização do sistema de conclusão compinit.

    Observe que o arquivo que contém uma definição de função deve conter o corpo da função , não a definição da função, porque o que o zsh executa quando a função é chamada é o conteúdo do arquivo. Então, se você quisesse colocar seu código em uma função, você o colocaria em um arquivo chamado extractque está em um dos diretórios em $fpath, contendo

    #autoload
    if [ -f $1 ]; then
    …
    

    Se você deseja ter um código de inicialização que seja executado quando a função é carregada ou para definir funções auxiliares, você pode usar este idioma (usado na distribuição zsh). Coloque a definição da função no arquivo, mais todas as definições auxiliares e qualquer outro código de inicialização. Ao final, chame a função, passando os argumentos. Então myfunctionconteria:

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

    PS

    7z xfunciona na maioria dos tipos de arquivo.

    • 15
  2. rools
    2018-03-09T23:46:17+08:002018-03-09T23:46:17+08:00

    Existem várias possibilidades para corrigir esse problema:

    • você pode colocar esta função em seu .zshrc;
    • você pode fornecer seu script;
    • você pode colocar o código da sua função diretamente em um arquivo chamado extract em um diretório que está no seu PATH.
    • 1

relate perguntas

  • problema ao iniciar aplicativos: linha de comando vs. gui

  • Shell Script para encontrar string no arquivo de log

  • Como incrementar uma variável nomeada dinamicamente em `zsh`

  • Por que não consigo definir uma variável somente leitura chamada path no zsh?

  • Renomeie (acrescentar) arquivos CSV em massa com base em um valor dentro

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve