Eu tenho um script BASH que funciona bem no terminal. Mas quando tento executá-lo na inicialização, nada acontece. Parece relacionado ao fato de que o script usa funções. Quando eu quebro os comandos das funções, ele funciona conforme o esperado na inicialização. Algum pensamento sobre o porquê? Aqui está um exemplo, mas qualquer código arbitrário na função cria o mesmo problema:
#!/bin/bash
say-stuff () {
notify-send Stuff "Here is some stuff."
}
say-stuff
Há um espaço antes do shebang em seu script - o que quebra a mágica do arquivo:
mas
Isso faz com que o mecanismo de inicialização automática do XDG volte a executar o script com /bin/sh, no qual
say-stuff
não é um nome de função válido:Você pode ver isso acontecendo se executar
xdg-autostart
em um terminal interativo com um arquivo .desktop mínimo:então
Ele "funciona" quando você executa o script diretamente porque
say-stuff
é um nome de função legal no bash; eseu shell interativo é bash, e isso faz com que o script com o shebang inválido também seja executado no bash
Veja também Qual interpretador de shell executa um script sem shebang?
Os trabalhos são executados
cron
ou os scripts de inicialização não são executados no mesmo ambiente de tempo de execução que você tem em sua área de trabalho. Os scripts de inicialização são executados como arquivosroot
. Nenhuma de suasPATH
alterações ou outras configurações de variáveis de ambiente~/.bashrc
são propagadas automaticamente para seucron
trabalho. Por exemplo, não há$DISPLAY
, então os programas GUI precisam de tratamento especial (leiaman xhost
).Pode-se definir variáveis de ambiente para todos os
cron
trabalhos nocrontab
arquivo Readman 5 crontab
.Veja os resultados de
echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
em cada um de seus ambientes.Uma maneira fácil é armazenar os comandos em um
bash
script e executá-lo a partir de sua sessão de terminal, salvando a saída, depois execute o script do ambiente "outro", salvando a saída. Compare as saídas salvas usandodiff
.