É possível criar comandos, colocar em um arquivo e rodar sem “./”? [duplicado]

4

Se eu criar um script em um arquivo como este:

#!/bin/bash
echo "test"

Até onde eu sei (como um novato) é colocá-lo em alguma pasta e torná-lo executável com

chmod +x myscript

e depois executá-lo com algo como ./myscript .

Eu acho que não é simples se eu tiver que criar um arquivo para cada comando que eu criar. Eu acho que será mais simples se eu puder colocá-lo em um único arquivo e então torná-lo executável sem adicionar ./ na frente de cada comando que eu criei. É possível?

    
por Mas Bagol 11.01.2015 / 09:51

4 respostas

10

Solução 1: funções Bash

As funções do Bash se comportam da mesma maneira que os comandos. Você pode colocar funções em - por exemplo - seu arquivo ~ / .bashrc, como

hello() {
   echo Hello World!
}

Então você pode rodar isso como qualquer outro comando, desde que você o inicie a partir do seu shell, e não de um cron job, script de init, etc:

me@pc:~$ hello
Hello World!

Solução 2: o diretório ~ / bin

O arquivo ~ / .profile padrão adiciona o diretório ~ / bin ao seu caminho se esse diretório existir. Portanto, crie um diretório bin em sua pasta pessoal e coloque seus scripts nesse diretório. Você ainda precisa usar chmod +x nos scripts, mas não precisa prefixá-los com ./

Não se esqueça de relogar depois de criar o diretório bin!

    
por Hontvári Levente 11.01.2015 / 10:55
4

Você precisa adicionar o ./ aos comandos executados dos scripts no diretório local, porque os comandos que não contêm / em seu nome são pesquisados somente nos diretórios mencionados no valor $PATH . Normalmente, esse valor contém apenas caminhos absolutos e, em particular, não contém um caminho . , de modo que o diretório de trabalho atual não seja considerado. Isso é uma coisa boa, porque, do contrário, pode-se tentar enganar os usuários para que executem scripts sem a intenção de fazê-lo colocando scripts com nomes que correspondam a comandos comuns, como ls em determinados diretórios; também não é muito prático tornar certos comandos apenas visíveis quando o diretório atual tem algum valor específico.

A solução natural é ter um determinado diretório onde você coloca os comandos privados que deseja chamar, e garantir que o nome (absoluto) desse diretório ocorra em $PATH . O local tradicional para esse diretório é $HOME/bin .

    
por Marc van Leeuwen 11.01.2015 / 12:28
0

Eu tenho um monte de aliases e funções shell definidas no meu ~/.bashrc

alias ll='ls -lh'
alias li='ls -lhi'
alias lll='ls -lhL'
alias l='ll'
complete -F _longopt l ll lll li  # this doesn't actually work

psg(){ ps aux | grep ${*:-$USER} | grep -v grep; }
psgw(){ ps auxww | grep ${*:-$USER} | grep -v grep; }

# expand aliases for sudo
alias sudo='sudo '
alias imv='imv -i'
alias mv='mv -i'
alias cp='cp -i'
alias rm='rm -i'
alias prealloc-mv='rsync --remove-source-files --sparse --preallocate -aH'
alias m=less
export LESS=iMRj5
alias j='jobs -l'
alias dr='disown -r'

cmpll() { ll "$@"; cmp "$@" && echo identical; }
findll() { find "$@" -exec ls -dlh --color=auto {} +; }
findinamell() {
    local i  args=()
    for i in "$@";do
            args+=( '-iname' )
            args+=( "*$i*" )
    done
    findll "${args[@]}";
}

Como outros apontaram, ~/bin está no seu $PATH por padrão, se existir, então você pode colocar coisas que são muito grandes para uma função de alias ou shell lá. Eu realmente tenho vários scripts realmente pequenos no meu ~/bin , IDK porque eu decidi fazer arquivos em vez de aliases. Procure por "COMMAND EXECUTION" na página man bash para mais detalhes sobre como os comandos são interpretados. man bash .

Se eu estiver preparando alguns comandos que são aplicáveis apenas a algo em que estou trabalhando em um determinado diretório, eu poderia colocar os comandos em um arquivo lá e executá-lo com ./do-stuff.sh. Seus dedos se acostumarão a digitar ./ rapidamente. Você também pode manter um arquivo de texto de comandos úteis que você usou, junto com uma descrição do que eles fazem. Eu faço isso algumas vezes quando não acho que vale a pena transformá-lo em uma função ou script que use parâmetros, mas apenas cole-o e edite-o conforme apropriado. por exemplo. para reproduzir audiobooks, geralmente uso:

mpl() { t=2200; mplayer -ss $(($t * (%2))) -endpos $(($t+5)) disc$(printf '%02d' $((1 + /2)))-38.mp3; date; }; mpl 4

(isso reproduz 2200 segundos de áudio, começando no início ($ 1 ímpar) ou 2200seg em uma das muitas trilhas numeradas. Basicamente mapeie um índice linear para um conjunto de arquivos de áudio que são cada um de dois blocos de áudio. longo.)

Eu posso fazer uma seta para cima e editar o final da linha de comando com o monitor desligado, enquanto adormeço. Eu uso uma função shell, então a parte que eu preciso editar está bem no final. Os aliases só funcionarão se todos os argumentos puderem ir direto ao final da parte fixa do comando.

Tenho certeza de que há uma boa quantidade de coisas boas por aí, se você pesquisar no Google, mas provavelmente há também uma tonelada de coisas desatualizadas e menos úteis, e não quero tirar um tempo para avaliar um guia agora.

    
por Peter Cordes 11.01.2015 / 15:34
0

Você sempre pode sair no diretório bin. Ou, digamos que é um script dela no local de /home/user/Desktop/hello.sh, você pode abrir ~ / .bashrc e adicioná-lo

    hello() {
    '/home/user/Desktop/hello.sh'
    }

Então, você pode executar o 'olá' no terminal e ele deve funcionar perfeitamente.

    
por crank123 11.01.2015 / 18:56