我知道我曾经知道如何做到这一点,但是......你如何在 unix 登录时运行脚本(bash 可以)?
11 回答
当 Bash 启动时,它会执行各种不同脚本中的命令。
当 Bash 作为交互式登录 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。
当登录 shell 退出时,Bash 从文件 ~/.bash_logout(如果存在)读取并执行命令。
当一个不是登录 shell 的交互式 shell 启动时,Bash 从 ~/.bashrc 读取并执行命令,如果该文件存在的话。这可以通过使用 --norc 选项来禁止。--rcfile 文件选项将强制 Bash 从文件而不是 ~/.bashrc 读取和执行命令。
在登录时,大多数 shell 都会执行一个登录脚本,您可以使用它来执行您的自定义脚本。当然,shell 执行的登录脚本取决于 shell:
- bash:.bash_profile、.bash_login、.profile(为了向后兼容)
- sh: .profile
- tcsh 和 csh:.login
- zsh: .zshrc
您可能可以通过以下方式找出您正在使用的外壳
echo $SHELL
从提示。
对于“登录”的更广泛的定义,了解在大多数发行版上启动 X 时,您的 .xsessionrc 将在您的 X 会话启动时执行是很有用的。
使用 Bash 时,第一个~/.bash_profile
,~/.bash_login
和~/.profile
将为交互式登录 shell 运行。我相信~/.profile
除了 Bash 之外,它通常由 Unix shell 运行。Bash 将~/.bashrc
为非登录交互式 shell 运行。
我通常将我想要始终设置的所有内容放入其中.bashrc
,然后从中运行它.bash_profile
,我还设置了一些仅在我登录时才应该运行的东西,例如设置ssh-agent
或运行screen
。
如果您希望运行一个脚本并且只运行一个脚本,您可以将其设为用户默认 shell。
echo "/usr/bin/uptime" >> /etc/shells
vim /etc/passwd
* username:x:uid:grp:message:homedir:/usr/bin/uptime
可能会产生有趣的效果:)(它不安全,所以不要太相信它。没有什么比将默认外壳设置为擦除驱动器的脚本更好的了。...虽然,..我可以想象这样的场景可能非常有用)
将其放在您的bash 配置文件中:
~/.bash_profile
如果你在 OSX 上,那么它是~/.profile
Launchd
是 OS X 中的首选方式。
如果您希望它在登录时运行,请将其放入~/Library/LaunchAgents
开始launchd
项目
launchctl load /Library/LaunchDaemons/com.bob.plist
停止项目
launchctl unload /Library/LaunchDaemons/com.bob.plist
例子com.bob.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.bob</string>
<key>RunAtLoad</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/java</string>
<string>-jar</string>
<string>/Users/user/program.jar</string>
</array>
</dict>
</plist>
我对这个问题感到沮丧好几天。在 ubuntu 上没有任何效果。如果我将调用放在 /etc/profile 中,它在登录尝试时都会崩溃。我不能使用“启动应用程序”,因为那不是我想要的。这只会为该当前用户设置脚本。
最后我找到了这篇小文章:http ://standards.freedesktop.org/autostart-spec/autostart-spec-0.5.html
解决方案是:
找出 $XDG_CONFIG_DIRS 路径:
回声 $XDG_CONFIG_DIRS
把你的脚本放在那个目录
添加一个/etc/profile
执行脚本的条目。这将在每次登录期间运行。如果您只是为自己的帐户执行此操作,请使用您的登录脚本之一(例如.bash_profile
)来运行它。
在本地系统的 bash 手册页中搜索 ^INVOCATION 以获取有关在启动时将读取哪个文件的信息。
man bash
/^INVOCATION
同样在文件部分,
~/.bash_profile
The personal initialization file, executed for login shells
~/.bashrc
The individual per-interactive-shell startup file
将您的脚本添加到正确的文件中。确保脚本在 $PATH 中,或使用脚本文件的绝对路径。
该脚本~/.bash_profile
在登录时运行。