72

我知道我曾经知道如何做到这一点,但是......你如何在 unix 登录时运行脚本(bash 可以)?

4

11 回答 11

114

来自维基百科 Bash

当 Bash 启动时,它会执行各种不同脚本中的命令。

当 Bash 作为交互式登录 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。

当登录 shell 退出时,Bash 从文件 ~/.bash_logout(如果存在)读取并执行命令。

当一个不是登录 shell 的交互式 shell 启动时,Bash 从 ~/.bashrc 读取并执行命令,如果该文件存在的话。这可以通过使用 --norc 选项来禁止。--rcfile 文件选项将强制 Bash 从文件而不是 ~/.bashrc 读取和执行命令。

于 2008-09-18T21:29:02.403 回答
30

在登录时,大多数 shell 都会执行一个登录脚本,您可以使用它来执行您的自定义脚本。当然,shell 执行的登录脚本取决于 shell:

  • bash:.bash_profile、.bash_login、.profile(为了向后兼容)
  • sh: .profile
  • tcsh 和 csh:.login
  • zsh: .zshrc

您可能可以通过以下方式找出您正在使用的外壳

echo $SHELL

从提示。

对于“登录”的更广泛的定义,了解在大多数发行版上启动 X 时,您的 .xsessionrc 将在您的 X 会话启动时执行是很有用的。

于 2008-09-18T22:10:42.083 回答
10

使用 Bash 时,第一个~/.bash_profile,~/.bash_login~/.profile将为交互式登录 shell 运行。我相信~/.profile除了 Bash 之外,它通常由 Unix shell 运行。Bash 将~/.bashrc为非登录交互式 shell 运行。

我通常将我想要始终设置的所有内容放入其中.bashrc,然后从中运行它.bash_profile,我还设置了一些仅在我登录时才应该运行的东西,例如设置ssh-agent或运行screen

于 2008-09-18T21:33:54.480 回答
5

如果您希望运行一个脚本并且运行一个脚本,您可以将其设为用户默认 shell。

echo "/usr/bin/uptime" >> /etc/shells
vim /etc/passwd  
  * username:x:uid:grp:message:homedir:/usr/bin/uptime

可能会产生有趣的效果:)(它不安全,所以不要太相信它。没有什么比将默认外壳设置为擦除驱动器的脚本更好的了。...虽然,..我可以想象这样的场景可能非常有用)

于 2008-09-18T21:34:55.320 回答
3

将其放在您的bash 配置文件中:

~/.bash_profile
于 2008-09-18T21:25:50.507 回答
3

如果你在 OSX 上,那么它是~/.profile

于 2008-09-18T21:26:44.217 回答
3

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>
于 2008-09-19T14:06:32.807 回答
3

我对这个问题感到沮丧好几天。在 ubuntu 上没有任何效果。如果我将调用放在 /etc/profile 中,它在登录尝试时都会崩溃。我不能使用“启动应用程序”,因为那不是我想要的。这只会为该当前用户设置脚本。

最后我找到了这篇小文章:http ://standards.freedesktop.org/autostart-spec/autostart-spec-0.5.html

解决方案是:

  1. 找出 $XDG_CONFIG_DIRS 路径:

    回声 $XDG_CONFIG_DIRS

  2. 把你的脚本放在那个目录

于 2015-04-29T11:27:23.343 回答
2

添加一个/etc/profile执行脚本的条目。这将在每次登录期间运行。如果您只是为自己的帐户执行此操作,请使用您的登录脚本之一(例如.bash_profile)来运行它。

于 2008-09-18T21:44:24.830 回答
2

在本地系统的 bash 手册页中搜索 ^INVOCATION 以获取有关在启动时将读取哪个文件的信息。

man bash
/^INVOCATION

同样在文件部分,

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

将您的脚本添加到正确的文件中。确保脚本在 $PATH 中,或使用脚本文件的绝对路径。

于 2008-09-19T00:24:46.457 回答
1

该脚本~/.bash_profile在登录时运行。

于 2008-09-18T21:24:53.130 回答