Executando scripts de outro diretório

9

Muitas vezes, o script que eu quero executar não está localizado no meu diretório de trabalho atual e eu realmente não quero deixá-lo.

É uma boa prática executar scripts (BASH, Perl, etc.) de outro diretório? Eles costumam encontrar todas as coisas que precisam para funcionar corretamente?

Se sim, qual é a melhor maneira de executar um script "distante"? É

. /path/to/script

ou

sh /path/to/script

e como usar sudo nesses casos? Isso, por exemplo, não funciona:

sudo . /path/to/script
    
por Desmond Hume 24.11.2012 / 23:35

8 respostas

9

sh / path / to / script gerará um novo shell e executará o script independente de seu shell atual. O comando source (.) Chamará todos os comandos no script no shell atual. Se o script chamar exit por exemplo, você perderá o shell atual. Por causa disso, é mais seguro chamar scripts em um shell separado com sh ou executá-los como binários usando o caminho completo (começando com /) ou relativo (./). Se chamados como binários, eles serão executados com o interpretador especificado (#! / Bin / bash, por exemplo).

Quanto a saber se um script vai ou não encontrar os arquivos de que precisa, não há uma boa resposta, além de olhar o script para ver o que ele faz. Como opção, você sempre pode ir para a pasta do script em um subprocesso sem sair da pasta atual:

$(cd /wherever/ ; sh script.sh)
    
por 25.11.2012 / 03:05
6

Você pode definitivamente fazer isso (com os ajustes que os outros mencionaram como sudo sh /pathto/script.sh ou ./script.sh ). No entanto, eu faço uma das poucas coisas para executá-los em todo o sistema para não se preocupar com dirs e salvar-me digitação extra inútil.

1) Symlink para /usr/bin

ln -s /home/username/Scripts/name.sh /usr/bin/name

(certifique-se de que não há nenhum nome sobreposto, porque você obviamente o substituiria.) Isso também me permite mantê-los em minhas pastas de desenvolvimento para que eu possa ajustar conforme necessário.

2) Adicione o diretório Scripts ao seu caminho (usando .bash_profile - ou whatever.profile no seu shell)

PATH=/path/to/scripts/:$PATH

3) Crie Alias no .bash_profile em ~/.bash_profile adicione algo como:

alias l="ls -l"

Como você pode dizer, a sintaxe é apenas alias, dígitos que você quer que funcionem como um comando, o comando. Então, digitando "l" em qualquer lugar no terminal resultaria em ls -l Se você quiser sudo, apenas alias sl="sudo ls -l" anote para si mesmo l vs sl (como um exemplo inútil).

De qualquer forma, você pode digitar sudo nameofscript e seguir o seu caminho. Não há necessidade de mexer com ./ ou. ou sh, etc. Basta marcá-los como executáveis primeiro: D

    
por 24.11.2012 / 23:53
3

Eu geralmente gosto de você dizer

sh /path/to/script

E para executá-lo como root / superusuário

sudo sh /path/to/script

Seu diretório atual só importa se os scripts assumirem que você está na mesma pasta que ele. Eu diria que a maioria dos scripts não faz isso e você está salvo para executá-lo como acima.

    
por 24.11.2012 / 23:58
3

Eu costumo manter meus scripts em /usr/local/bin ou /usr/local/sbin/ (se o script precisa de privilégios de root) onde, de acordo com o Filesystem Hierarchy Standard (FHS), eles pertencem.

Tudo o que você precisa fazer é garantir que esses dois diretórios sejam adicionados ao seu PATH . Você pode fazer isso editando o arquivo $HOME/.bashrc e adicionando esta linha:

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

Se você quiser executar um script como root por meio de sudo , será necessário adicionar esses diretórios à variável secure_path em /etc/sudoers .

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

A edição deste arquivo é feita executando visudo , o que garante que você não tenha erros.

    
por 25.11.2012 / 00:00
0

Não tenho certeza se funciona assim no linux, supondo que isso não ocorra se ninguém sugerir isso. Mas em vez de usar ././ para voltar diretórios. Você pode usar citações para dar um caminho absoluto? Talvez isso não lhe dê acesso a toda a unidade para poder fazer isso, na verdade, chegar a pensar nisso.

    
por 26.11.2012 / 08:43
0

Se você tem scripts por aí que precisa rodar com frequência, e eles dependem de sua localização para encontrar recursos, você pode fazer isso simplesmente combinando comandos em um alias como este.

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

Desta forma, não é necessário alterar mais nada para que funcione.

    
por 31.05.2016 / 14:28
0

Não sei por que ninguém sugeriu esse, mas é super fácil! Já pesquisei algumas vezes e não consegui encontrar a resposta exata que estou dando, então pensei em compartilhar. IMO, esta, mas a melhor solução, também a mais fácil, para mim de qualquer maneira, no entanto, outros podem sentir e fazer as coisas de maneira diferente.

# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

Primeiro o comando 'cd' informando o diretório da localização dos scripts. Então '& &' para que você possa amarrá-lo depois de executar o próximo comando. Por fim, abra o seu script da mesma forma que você faria no terminal! Guardei o seu no seu ficheiro BASH e demora 5 segundos a configurar.

Espero que isso tenha ajudado alguém.

    
por 03.06.2018 / 08:08
-1

Pergunta antiga, mas intemporal.

A solução que eu vi consistentemente é ter um diretório $HOME/bin e colocá-lo primeiro em $PATH (via ~/.bashrc se ele ainda não estiver lá; em alguns sistemas ~/bin é o primeiro em $PATH por padrão). Eliminar scripts para execução ou links simbólicos para scripts / executáveis em outro lugar é a maneira mais simples de lidar com problemas de caminho que não devem afetar o sistema ou outros usuários.

Se um script requer recursos adicionais que podem ser encontrados em relação à sua própria localização (não incomum), então o envvar $BASH_SOURCE é usado. $BASH_SOURCE sempre contém o caminho absoluto para o próprio script atualmente em execução, independentemente do valor de $PWD .

Considere o seguinte:

ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Portanto, podemos ver que $HOME/bin é o primeiro em $PATH , portanto, o que eu colocar em ~/bin será executado. Eu tenho um script de demonstração chamado ~/bin/findme :

#!/bin/bash

echo "Running from $BASH_SOURCE"

Isso pode ser usado para obter o caminho absoluto para a localização do script em execução.

ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme
    
por 24.05.2018 / 04:45