Frequentemente, 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 geralmente encontrarão todas as coisas necessárias para executar corretamente?
Em caso afirmativo, qual é a melhor maneira de executar um script "distante"? É isso
. /path/to/script
ou
sh /path/to/script
e como usar sudo
nesses casos? Isso, por exemplo, não funciona:
sudo . /path/to/script
. /path/to/script
origina o script! Você não precisa do período se apenas deseja executá-lo.Respostas:
sh / path / to / script gerará um novo shell e executará o script independentemente do seu shell atual. O
source
comando (.) Chamará todos os comandos no script no shell atual. Se o script chamarexit
por exemplo, você perderá o shell atual. Por esse motivo, geralmente é 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 intérprete especificado (#! / Bin / bash, por exemplo).Quanto a saber se um script encontrará ou não os arquivos necessários, não há uma boa resposta, além de olhar para 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:
fonte
(cd /wherever/ ; sh script.sh)
? Por que você tem um$
na frente?Você pode fazer isso definitivamente (com os ajustes que os outros mencionaram como
sudo sh /pathto/script.sh
ou./script.sh
). No entanto, eu faço uma de algumas coisas para executá-las em todo o sistema para não me preocupar com dirs e economizar uma digitação extra inútil.1) Link simbólico para
/usr/bin
(certifique-se de que não haja um nome sobreposto, porque você obviamente o substituirá.) 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 o que quer que seja que você tenha no seu shell)
PATH=/path/to/scripts/:$PATH
3) Crie Alias no
.bash_profile
in~/.bash_profile
adicione algo como:Como você pode ver, a sintaxe é apenas alias, dígitos que você deseja que atuem como um comando, o comando. Assim, digitar "l" em qualquer lugar do terminal resultaria em
ls -l
Se você quiser sudo, apenasalias sl="sudo ls -l"
observe-se l vs sl (como um exemplo inútil).De qualquer forma, você pode apenas digitar
sudo nameofscript
e seguir seu caminho. Não há necessidade de mexer com ./ ou. ou sh, etc. Apenas marque-os como executáveis primeiro: Dfonte
Eu costumo fazer como você diz
E executá-lo como root / superusuário
Seu diretório atual importa apenas 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.
fonte
Normalmente, mantenho meus scripts em (
/usr/local/bin
ou/usr/local/sbin/
se o script precisar de privilégios de root) onde, de acordo com o FHS (File System Hierarchy Standard), eles pertencem.Tudo que você precisa fazer é garantir que esses dois diretórios sejam adicionados ao seu
PATH
. Você pode fazer isso editando seu$HOME/.bashrc
arquivo e adicionando esta linha:Se você deseja executar um script como root via
sudo
, você deve adicionar esses diretórios à variávelsecure_path
no seu/etc/sudoers
.A edição deste arquivo é feita executando, o
visudo
que garante que você não cometa erros.fonte
.bashrc
vez de.bachrc
.Não tenho certeza se funciona assim no linux, assumindo que não, se ninguém sugeriu. Mas em vez de usar ././ para voltar aos diretórios. Você pode usar aspas para dar um caminho absoluto? Talvez não lhe dê acesso a toda a unidade para poder fazer isso.
fonte
Se você possui scripts por aí, precisa executar com freqüência e eles dependem da localização deles para encontrar recursos, você pode fazer isso facilmente, combinando comandos em um alias como este.
Dessa forma, você não precisa alterar mais nada para fazê-lo funcionar.
fonte
Não sei por que ninguém sugeriu este, mas é super fácil! Pesquisei no Google 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.
Primeiro, o comando 'cd' informando o diretório do local dos scripts. Em seguida, '&&' para que você possa amarrá-lo após executar o próximo comando. Por fim, abra seu script exatamente como você o executaria no terminal! Salve o seu arquivo BASH e leva 5 segundos para configurar.
Espero que isso tenha ajudado alguém.
fonte
Pergunta antiga, mas atemporal.
A solução que eu sempre vi é ter um
$HOME/bin
diretório e colocá-lo em primeiro lugar$PATH
(via~/.bashrc
se ele ainda não estiver lá; em alguns sistemas~/bin
é o primeiro a entrar$PATH
por padrão). Colocar scripts lá para execução ou links simbólicos para scripts / executáveis em outros lugares é a maneira 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), 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:
Para que possamos ver o que
$HOME/bin
é o primeiro a$PATH
entrar, o que quer que eu coloque~/bin
será executado. Eu tenho um script de demonstração chamado~/bin/findme
:Isso pode ser usado para obter o caminho absoluto para a localização do script em execução.
fonte
bin
diretório privado ? Isso parece complicado. (3) Além disso, quebra a independência da localização. Se/home/desmond/bin/foo
for um link para o meu script,BASH_SOURCE
será/home/desmond/bin/foo
, e o script não poderá encontrar seus recursos./bin
ou em um local conhecido em/opt
. (3) Independência de localização é exatamente o que isso preserva ao escrever uma coleção interdependente de scripts pessoais.