如何从 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。
所以你必须让他们进入 background 或 detached.
要在后台执行命令,您只需在脚本中的命令行末尾添加 &
。
例如:
#!/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 在这种情况下)
尽你所能自动化你生活的一部分! (它似乎没有正常工作......)。这次是为了在早上煮咖啡的同时打开桌面上的多个应用程序。
我创建了一个 .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。 所以你必须让他们进入 background 或 detached.
要在后台执行命令,您只需在脚本中的命令行末尾添加 &
。
例如:
#!/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 在这种情况下)