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

Linux 如何在*nix中登录时运行脚本?,linux,bash,macos,unix,shell,Linux,Bash,Macos,Unix,Shell,我知道我曾经知道怎么做,但是。。。如何在unix中登录时运行脚本(bash正常?该脚本~/。bash\u配置文件在登录时运行。将其放置在您的: 如果您在OSX上,那么它是来自 当Bash启动时,它以各种不同的方式执行命令 脚本 当Bash作为一个交互函数调用时 登录shell时,它首先读取 执行文件中的命令 /etc/profile,如果该文件存在。 读取该文件后,它将查找 ~/.bash\u配置文件、~/.bash\u登录和 ~/.profile,按该顺序,并读取 并从第一个 一种存在且可读的

我知道我曾经知道怎么做,但是。。。如何在unix中登录时运行脚本(bash正常?

该脚本
~/。bash\u配置文件在登录时运行。

将其放置在您的:


如果您在OSX上,那么它是来自

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

当Bash作为一个交互函数调用时 登录shell时,它首先读取 执行文件中的命令 /etc/profile,如果该文件存在。 读取该文件后,它将查找 ~/.bash\u配置文件、~/.bash\u登录和 ~/.profile,按该顺序,并读取 并从第一个 一种存在且可读的东西

当登录shell退出时,Bash读取 并执行文件中的命令 ~/.bash\u注销(如果存在)

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


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

我通常会将所有我想一直设置的内容都放在
.bashrc
中,然后从
.bash\u profile
运行它,在那里我还设置了一些只有在登录时才应该运行的内容,例如设置
ssh代理
或运行
屏幕
,如果您希望运行一个脚本和一个脚本,您可以将其设置为用户默认的shell

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

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

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

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

  • bash:.bash\u profile、.bash\u login、.profile(用于向后兼容)
  • 上海:。个人资料
  • tcsh和csh:.登录
  • zsh:.zshrc
您可以通过执行以下操作来了解您正在使用的shell

echo $SHELL
从提示中


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

搜索本地系统的bash手册页,查找^INVOCATION以获取启动时将读取的文件的信息

man bash
/^INVOCATION
在文件部分

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

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

启动是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>

标签
com.bob
运行负荷
程序参数
/usr/bin/java
-罐子
/Users/user/program.jar

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

最后我找到了这篇小文章:

解决办法是:

  • 查找$XDG\u CONFIG\u目录路径:

    echo$XDG\u配置\u目录

  • 将脚本放在该目录中


  • echo$0应该会显示正在使用哪个shell,虽然我偶尔会看到“sh”报告,但我认为在HP-UX或Solaris上它实际上是“ksh”。什么登录?用户界面登录?像侏儒,GTK,统一?也许是来自tty的新shell登录?他们之间的区别是什么?仅仅十年后,但是:如果该命令需要sudo(例如,将网络共享从NAS安装到用户的home dir中)怎么办@Mike'Pomax'Kamermans问得好,也许sudo是假定的,因为它在系统的文件中?也许,但也许不是-希望有人仍然能为我们回答这个问题=(
    <?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>