尽可能自动化您生活的一部分! (它似乎无法正常工作......)。这次是在我早上煮咖啡时打开桌面上的多个应用程序。
我创建了一个 .sh 来打开我的工作区应用程序,例如 Visual Code、Slack、Firefox 等。
脚本基本上是:
exec code
exec /usr/local/firefox_dev/firefox
exec snap/slack/39/usr/bin/slack
exec /snap/spotify/current/usr/share/spotify/spotify
我基本上找到了可执行应用程序的路径,并将 exec 放在它们前面...是的,我
chmod +x ./workspace-apps-script.sh
使其可执行。
问题是:无论我把哪一行放在前面,它都只执行第一行。我希望他们一张一张地打开,直到最后一张。
问题是您的应用程序在启动时不会返回。 所以你必须让它们进入背景或分离。
要在后台执行命令,您只需在脚本中的命令行末尾添加
&
即可。
例如:
#!/bin/bash
code &
/usr/local/firefox_dev/firefox &
snap/slack/39/usr/bin/slack &
/snap/spotify/current/usr/share/spotify/spotify &
如果要在分离模式下执行命令,可以在命令行开头使用
nohup
。例如:
#!/bin/bash
nohup code
nohup /usr/local/firefox_dev/firefox
nohup snap/slack/39/usr/bin/slack
nohup /snap/spotify/current/usr/share/spotify/spotify
我建议您结合使用两种模式以获得最佳效果。所以你可以在你的脚本中执行此操作:
#!/bin/bash
nohup code &
nohup /usr/local/firefox_dev/firefox &
nohup snap/slack/39/usr/bin/slack &
nohup /snap/spotify/current/usr/share/spotify/spotify &
但是,如果您想在每次登录电脑时执行此操作,您可以直接在您的
.bashrc
文件中写入 abobe 行,该文件位于您的主目录中,并在每次登录时执行。
从开头删除
exec
(直接调用程序即可):
#!/bin/bash
code
/usr/local/firefox_dev/firefox
snap/slack/39/usr/bin/slack
/snap/spotify/current/usr/share/spotify/spotify
您可以随时使用
shellcheck -s bash <your-script-path>
来查看是否有错误。
如果您一般不熟悉 bash 和 shell 脚本,那么
exec
并不是您想象的那样。它不是用于执行程序。
exec
是一个 shell 内置命令,它用传递给 exec 的程序替换当前正在执行的进程(在本例中为 shell)。
因此,
exec /usr/local/firefox_dev/firefox
用firefox
程序替换/覆盖您的shell进程,但它不会创建新进程。要了解差异,请参阅以下命令:
$ # At the Command Prompt
$ # To see running processes, call ps
$ ps
PID TTY TIME CMD
6017 pts/2 00:00:00 ps
19890 pts/2 00:00:01 bash
$
$ exec /usr/local/firefox_dev/firefox # Replaces bash with firefox program and firefox will now have PID of bash which is 19890 in this example
重要的是,由于调用者进程不再存在,因此程序不会将控制权返回给调用者程序(shell)。因此,就您而言,这就是仅第一个程序运行而其余程序不运行的原因。 如果您不使用 exec 调用程序,它将获得一个新的 PID(进程 ID),并且被调用的程序将成为调用者进程(在本例中为 shell)的子进程
在 Android 中打开应用程序? (APK)