如何在* nix中登录时运行脚本?

时间:2008-09-18 21:24:14

标签: linux bash macos unix shell

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

11 个答案:

答案 0 :(得分:110)

来自wikipedia Bash

  

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

     

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

     

当登录shell退出时,Bash会读取   并从文件中执行命令   〜/ .bash_logout,如果它存在。

     

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

答案 1 :(得分:27)

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

  • bash:.bash_profile,.bash_login,.profile(适用于向后兼容性)
  • sh:.profile
  • tcsh和csh:.login
  • zsh:.zshrc

你可以通过

找出你正在使用的shell
echo $SHELL

来自提示。

对于稍微宽泛的“登录”定义,知道在启动X时大多数发行版都很有用,你的.xsessionrc将在你的X会话启动时执行。

答案 2 :(得分:9)

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

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

答案 3 :(得分:5)

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

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

可以有有趣的效果:)(它不安全,所以不要太信任它。没有什么比设置你的默认shell是擦除你的驱动器的脚本。...虽然,...我可以想象一个可能非常有用的场景)

答案 4 :(得分:3)

将其放在bash profile

~/.bash_profile

答案 5 :(得分:3)

如果您使用的是OSX,则为~/.profile

答案 6 :(得分: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>

答案 7 :(得分:3)

我好几天都对这个问题感到沮丧。什么都没有在ubuntu上工作。如果我将调用放在/ etc / profile中,那么在登录尝试时它都会崩溃。我无法使用&#34;启动应用程序&#34;因为那不是我想要的。这只为当前用户设置脚本。

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

解决方案是:

  1. 找出$ XDG_CONFIG_DIRS路径:

    回显$ XDG_CONFIG_DIRS

  2. 将您的脚本放在该目录中

答案 8 :(得分:2)

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

答案 9 :(得分:2)

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

man bash
/^INVOCATION

同样在FILES部分,

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

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

答案 10 :(得分:1)

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