Como executo um script de shell sem usar os comandos "sh" ou "bash"?

261

Eu tenho um script de shell que eu quero executar sem usar os comandos "sh" ou "bash". Por exemplo:

Ao invés de: sh script.sh

Eu quero usar: script.sh

Como posso fazer isso?

PS (i) Não uso muito o shell script e tentei ler sobre aliases, mas não entendi como usá-los.

(ii) Também li sobre como vincular o script a outro arquivo nas variáveis ​​PATH. Estou usando meu servidor universitário e não tenho permissões para criar um arquivo nesses locais.

Rameez Hussain
fonte
1
As respostas indicam como tornar o script executável, mas não parecem cobrir como torná-lo acessível. Para isso, crie um diretório bin - $HOME/bin- se você ainda não possui um, adicione-o ao seu PATH (próximo à frente). Coloque os scripts (e quaisquer outros programas) que você deseja executar diretamente sem especificar o nome do caminho aqui ou links simbólicos aqui para onde estão os programas reais.
Jonathan Leffler
1
Depois de seguir as respostas abaixo, para remover o ".sh", você pode renomear o arquivo: mv example.sh examplee, em seguida, exampledeve funcionar por conta própria.
PJ Brunet

Respostas:

434

Adicione um "shebang" na parte superior do seu arquivo:

#!/bin/bash

E torne seu arquivo executável ( chmod +x script.sh).

Por fim, modifique seu caminho para adicionar o diretório em que seu script está localizado:

export PATH=$PATH:/appropriate/directory

(normalmente, você deseja $HOME/binarmazenar seus próprios scripts)

fge
fonte
Hey, obrigado pela sua resposta. Eu tentei isso. Agora eu posso executá-lo sem o comando "sh". Mas ainda tenho que prefixar o comando com "./", o que não quero. :)
Rameez Hussain
5
Veja comentários sobre o caminho. Você precisa colocar seu script em um diretório que precisa anexar ao seu PATH.
fge
2
não funcionou no meu caso. mas source script.shfuncionou bem, ou melhor # source <filename_without_any_extension_type>
MycrofD 22/03
4
source ./my-cool-script(ou . ./my-cool-script) poluirá a sessão atual do shell com quaisquer variáveis ​​definidas no script. O fornecimento não deve ser usado, a menos que você deseje modificar explicitamente a sessão do shell, definindo vars do ambiente, alterando o diretório etc. Erros muito terríveis podem resultar de outra forma, pois as variáveis ​​de uma execução de script, se feitas via sourcing, podem afetar outra execução de script.
Daniel Waltrip
3
Se você tem certeza de que a pasta de scripts está em PATH e ainda não funciona sem ./, poderá haver uma colisão de nomes. Tente renomear.
chorbs
66

Estes são alguns dos pré-requisitos para usar diretamente o nome do script:

  1. Adicione a she-bang (#!/bin/bash)linha no topo.
  2. Usando chmod u+x scriptnamemake o script executável. (onde scriptnameestá o nome do seu script)
  3. Coloque o script na /usr/local/binpasta
  4. Execute o script usando apenas o nome do script.

Nota: O motivo pelo qual sugeri colocá-lo na /usr/local/binpasta é porque provavelmente esse caminho já foi adicionado ao seu PATH variable.

Atualizar:

Se você não tiver acesso à /usr/local/binpasta, faça o seguinte:

  1. Crie uma pasta no seu diretório pessoal e vamos chamá-lo myscripts.
  2. Faça ls -lartno seu diretório pessoal, para identificar o script de inicialização que seu shell está usando. Deve ser .profileou .bashrc.
  3. Depois de identificar o script de inicialização, adicione a seguinte linha no seu script - export set PATH=$PATH:~/myscript.
  4. Depois de adicionado, forneça seu script de inicialização ou efetue logout e logon novamente.
  5. Execute seu script usando scriptname.
jaypal singh
fonte
Tentei fazer isso, mas não tenho permissões para acessar a pasta / usr / local / bin. Eu estou usando um computador universitário.
Rameez Hussain
1
Você poderia me dizer o que você quer dizer com "fonte do seu script de inicialização"?
Rameez Hussain
1
Fornecer o script de inicialização significa executá-lo para que o novo parâmetro configurado para a variável PATH seja selecionado pelo shell. Isso pode ser feito fazendo . .bashrc. Ou seja, basta colocar .seguido de spacee, em seguida, o nome do script de inicialização.
jaypal singh
Eu não sei qual é o problema com o sistema. Eu criei um novo script de shell chamado "olá" com apenas um "eco" olá "". Mudei suas permissões e tentei ./hello. Isso não funciona.
Rameez Hussain,
Que mudanças você fez nos scripts de inicialização?
jaypal singh
20

Apenas verifique se ele é executável, usando chmod +x. Por padrão, o diretório atual não está no seu PATH, portanto, você precisará executá-lo como ./script.sh- ou referenciá-lo por um caminho qualificado. Como alternativa, se você realmente precisa apenas script.sh, precisará adicioná-lo ao seu PATH. (Você pode não ter acesso para modificar o caminho do sistema, mas quase certamente pode modificar o CAMINHO do seu próprio ambiente atual.) Isso também pressupõe que seu script comece com algo parecido #!/bin/sh.

Você também pode usar um alias, que não está realmente relacionado ao script de shell, mas apenas ao shell, e é simples como:

alias script.sh='sh script.sh'

O que permitiria que você usasse simplesmente script.sh(literalmente - isso não funcionará em nenhum outro *.sharquivo) em vez de sh script.sh.

ziesemer
fonte
Ei! Obrigado pela sua resposta. Eu tentei usar aliases anteriormente. Mas nada aconteceu. Coloquei-o imediatamente após a linha "#! / Usr / local / bin / bash". O que você acha que está errado.
Rameez Hussain
1
Um alias não pode ser definido no seu script - ele deve ser declarado como parte do seu ambiente atual. Portanto, basta executar o aliascomando no prompt do shell e, em seguida, o alias estará disponível para executar o comando.
Ziesemer
17

Neste exemplo, o arquivo será chamado myShell

Antes de tudo, precisamos criar esse arquivo, podemos começar digitando o seguinte:

sudo nano myShell

Reparou que não colocamos a .shextensão? Isso porque quando o rodamos no terminal, precisamos apenas digitar myShellpara executar nosso comando!

Agora, no nano, a linha superior DEVE ser, #!/bin/bashentão você pode deixar uma nova linha antes de continuar.

Para demonstração, adicionarei uma Hello World!resposta básica

Então, digito o seguinte:

echo Hello World!

Depois disso, meu exemplo deve ficar assim:

#!/bin/bash
echo Hello World!

Agora salve o arquivo e execute o seguinte comando:

sudo chmod +x myShell

Agora, tornamos o arquivo executável, para o qual podemos movê-lo /usr/bin/usando o seguinte comando:

sudo cp myShell /usr/bin/

Apenas para garantir que a máquina possa executá-la corretamente, precisaremos reiniciar a máquina

eu usei sudo shutdown -r now

Parabéns! Nosso comando está pronto! No terminal, podemos digitar myShelle deve-se dizerHello World!

triplo
fonte
1
Você não deve colocar seus próprios arquivos /usr/bin- muitos sistemas são utilizados /usr/local/binpara esse fim e se reservam /usr/binestritamente para o sistema operacional.
Tripleee
Não há necessidade de sudo chmodseu próprio arquivo.
Tripleee 18/11/19
Não há necessidade de reiniciar a máquina. No máximo, você deve
procurar
14

Você precisa habilitar o bit executável para o programa.

chmod +x script.sh

Então você pode usar ./script.sh

Você pode adicionar a pasta ao PATH no seu .bashrcarquivo (localizado no diretório inicial). Adicione esta linha ao final do arquivo:

export PATH=$PATH:/your/folder/here
Uku Loskit
fonte
Esqueci de mencionar que já defini as permissões corretas. Eu usei o comando "chmod 755 script.sh"
Rameez Hussain
6

Você pode digitar sudo install (nome do script) / usr / local / bin / (o que você deseja digitar para executar o referido script)

ex: sudo install quickcommit.sh /usr/local/bin/quickcommit digite a senha

agora pode ser executado sem .sh e em qualquer diretório

JoelWass
fonte
3

Adicionar . (diretório atual) para sua variável PATH.
Você pode fazer isso editando seu arquivo .profile.
Coloque a seguinte linha no seu arquivo .profile
PATH=$PATH:.

Apenas adicione a #!/bin/bashlinha Shebang ( ) no início do seu script e torne o script executável (usando chmod +x <File Name>).

Arpit Tyagi
fonte
0

Aqui está o meu script de backup que lhe dará a ideia e a automação:

Servidor: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql etc ...

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

mude / home / user para o diretório de usuário e digite: backupscript em qualquer lugar do terminal para executar o script! (assumindo que / usr / bin esteja no seu caminho)

Tarik
fonte
0

Digite "#!/bin/sh"antes do script. Em seguida, salve-o como script.shpor exemplo. copie-o para $HOME/bin ou $HOME/usr/bin
O diretório pode ser diferente em diferentes distros linux, mas eles terminam com 'bin' e estão no diretório inicial cd $HOME/bin ou no $HOME/usr/bin
Tipo chmod 700 script.sh
E você pode executá-lo apenas digitando run.sh no terminal. Se não funcionar, tente em chmod +x run.sh vez de chmod 700 run.sh

Gyan Prakash
fonte
As partes desta resposta que não reapresentam informações de respostas existentes muito antigas são confusas.
tripleee
0

Tornar qualquer arquivo como executável


Digamos que você tenha um arquivo executável chamado migrate_linux_amd64 e deseje executá-lo como um comando como "migrar"

  1. Primeiro teste o arquivo executável a partir do local do arquivo:
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. Verifique se você possui privilégios de execução no arquivo,
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    caso contrário, executechmod +x migrate.linux-amd64

  2. Em seguida, copie seu arquivo para /usr/local/bin. Este diretório pertence ao root, use sudo ou alterne para root e execute a seguinte operação

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Em seguida, crie um link simbólico como abaixo
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Por fim, adicione / usr / local / bin ao seu caminho ou perfil de usuário
export PATH = $PATH:/usr/local/bin
  1. Em seguida, execute o comando como "migrar"
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
Guru
fonte
-1

Somente:

/path/to/file/my_script.sh
DimiDak
fonte