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


70

我知道我曾经知道如何执行此操作,但是...如何在登录UNIX时运行脚本(bash正常)?


1
什么登录名?UI登录?像gnome,GTK,Unity?也许是从tty重新登录的shell?它们之间有什么区别?
AlikElzin-kilaka 2012年

Answers:


112

来自维基百科

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

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

当退出登录外壳程序时,Bash从〜/ .bash_logout文件(如果存在)中读取并执行命令。

启动不是登录外壳程序的交互式外壳程序时,如果该文件存在,则Bash从〜/ .bashrc读取并执行命令。使用--norc选项可以禁止这种情况。--rcfile file选项将强制Bash从文件而不是〜/ .bashrc中读取并执行命令。


3
仅晚了十年,但是:如果该命令需要sudo(例如,将来自NAS的网络共享安装到用户的主目录中)该
怎么办

@ Mike'Pomax'Kamermans的很好的问题,也许假设Sudo是因为它在系统的文件中?
Webwoman

也许,但也许不是-希望有人能为我们解答(=
Mike'Pomax'Kamermans

29

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

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

您可能会发现您正在使用什么shell

echo $SHELL

从提示。

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


1
echo $ 0应该显示正在使用哪个外壳程序,尽管我偶尔会看到“ sh”的报告,而实际上它是“ ksh”的-我认为在HP-UX或Solaris上。
dr-jan

10

当使用bash,第一~/.bash_profile~/.bash_login~/.profile用于交互式登录shell将会运行。我相信~/.profile除了Bash之外,它通常由Unix shell运行。重击将运行~/.bashrc非登录交互式外壳程序上运行。

我通常会放入所有我想一直设置的内容.bashrc,然后再从中运行它.bash_profile,在那里我还设置了一些仅在我登录时才能运行的东西,例如setupssh-agent或running screen


5

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

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

可能会产生有趣的效果:)(它不太安全,所以不要太信任它。没有什么比将默认外壳程序设置为擦除驱动器的脚本...了。。。。。可能非常有用)




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>

3

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

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

解决方案是:

  1. 找出$ XDG_CONFIG_DIRS路径:

    回声$ XDG_CONFIG_DIRS

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


2

/etc/profile其中添加执行脚本的条目。这将在每次登录时运行。如果您仅针对自己的帐户执行此操作,请使用您的登录脚本之一(例如.bash_profile)来运行它。


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中,或使用脚本文件的绝对路径。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.