我有一个在终端中运行良好的 BASH 脚本。但是当我试图让它在启动时运行时,什么也没有发生。这似乎与脚本使用函数的事实有关。当我将命令从功能中分离出来时,它会在启动时按预期工作。关于为什么的任何想法?这是一个示例,但函数中的任何任意代码都会产生相同的问题:
#!/bin/bash
say-stuff () {
notify-send Stuff "Here is some stuff."
}
say-stuff
我有一个在终端中运行良好的 BASH 脚本。但是当我试图让它在启动时运行时,什么也没有发生。这似乎与脚本使用函数的事实有关。当我将命令从功能中分离出来时,它会在启动时按预期工作。关于为什么的任何想法?这是一个示例,但函数中的任何任意代码都会产生相同的问题:
#!/bin/bash
say-stuff () {
notify-send Stuff "Here is some stuff."
}
say-stuff
在脚本中的 shebang 之前有一个空格 - 这会破坏文件的魔力:
但
这会导致 XDG 自动启动机制回退到使用 /bin/sh 执行脚本,其中
say-stuff
不是有效的函数名称:xdg-autostart
如果您在具有最小 .desktop 文件的交互式终端中运行,您会看到这种情况:然后
当您直接执行脚本时它“有效”,因为
say-stuff
是 bash 中的合法函数名;和您的交互式 shell 是 bash,这会导致带有无效 shebang 的脚本也在 bash 中运行
另请参阅哪个 shell 解释器运行没有 shebang 的脚本?
作业通过 运行
cron
,或者启动脚本不在您桌面上的相同运行时环境中运行。启动脚本以root
. 您的任何PATH
更改或其他环境变量设置~/.bashrc
都不会自动传播到您的cron
作业。例如,没有$DISPLAY
,所以 GUI 程序需要特殊处理(读取man xhost
)。cron
可以在crontab
文件 Read中为所有工作设置环境变量man 5 crontab
。查看
echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
每个环境中的结果。一种简单的方法是将命令存储在
bash
脚本中,并从终端会话执行它,保存输出,然后从“其他”环境执行脚本,保存输出。使用 比较保存的输出diff
。