Você geralmente deseja adicionar uma chamada a um intérprete no topo de seus scripts, da seguinte forma:
$cat myfile.sh
#!/bin/bash
source /pathto/venv/bin/activate
python /pathto/rsseater.py
Isto pode parecer muito semelhante ao que você tem, mas é de fato muito diferente. Em seu cenário, você está tentando executar os comandos dentro do shell que são chamados quando você executa sudo
. Com o exemplo acima, você está obtendo um shell Bash separado, que terá os vários comandos após a linha #!/bin/bash
ser invocada dentro dele. #!/bin/bash
resulta em um novo Bash shell sendo bifurcado.
Intérpretes e shebang
A nomenclatura de #!
é chamada de shebang. Você pode ler mais sobre isso por meio dos vários Q & A neste site e também em Wikipedia . Mas é suficiente dizer, ele diz ao sistema que quando um determinado arquivo é "executado" (também conhecido como run) para carregar um programa do disco primeiro (um interpretador), que então recebe a tarefa de analisar o conteúdo do arquivo apenas executado.
NOTA: Essencialmente tudo depois da linha shebang.
Intérpretes
Um interpretador é qualquer programa que pode processar comandos, um de cada vez, a partir de um arquivo. Neste caso, estamos usando o shell Bash como o interpretador. Mas existem outros shells que você pode usar aqui também, como shell C ou shell Korne, entre outros.
Você também pode usar intérpretes de nível superior, como Perl, Ruby ou Python, da mesma maneira.
Por que o erro usando 'sudo -s'
Se você der uma olhada na página do manual de sudo
, isso tem a dizer sobre -s
:
-s [command]
The -s (shell) option runs the shell specified by the SHELL
environment variable if it is set or the shell as specified in
the password database. If a command is specified, it is passed
to the shell for execution via the shell's -c option. If no
command is specified, an interactive shell is executed.
Então, quando você executar este comando:
$ sudo -s ./myfile.sh
O seguinte acontece:
$ /bin/sh
sh-4.2$ source somesource.bash
sh: source: somesource.bash: file not found
O shell, /bin/sh
não suporta o comando source
.