如何从 bash (Linux) 打开应用程序

How to open apps from bash (Linux)

尽你所能自动化你生活的一部分! (它似乎没有正常工作......)。这次是为了在早上煮咖啡的同时打开桌面上的多个应用程序。

我创建了一个 .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 使其可执行。

问题是:无论我把哪一行exec放在前面,它都只执行第一行。我希望他们一个一个打开,直到最后一个打开。

从开头删除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>查看是否有错误。

问题是您的应用程序在启动时 return。 所以你必须让他们进入 backgrounddetached.

要在后台执行命令,您只需在脚本中的命令行末尾添加 &。 例如:

#!/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 行,该文件位于您的主目录中,并在每次登录时执行。

如果您一般不熟悉 bash 和 shell 脚本编写,那么 exec 并不是您想象的那样。它不用于执行程序。 exec 是一个 shell 内置命令,它用您传递给 exec 的程序替换当前正在执行的进程(在本例中为 shell)。

因此,exec /usr/local/firefox_dev/firefox replaces/overwrites 您的 shell 进程使用 firefox 程序,但它不会创建新进程。要了解差异,请参阅以下命令:

$ # 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

而且重要的是,该程序不会 return 控制调用程序 (shell),因为调用进程已不存在。因此,在您的情况下,这就是只有第一个程序运行而不运行其余程序的原因。 如果你不使用 exec 调用一个程序,它会得到一个新的 PID(进程 ID)并且被调用的程序成为调用者进程的子进程(shell 在这种情况下)