你好,我很好奇是否可以在 bash rc 中执行 bash 脚本。除非有某种方法告诉它不要尝试启动新的 shell,否则它似乎会创建一个无限循环。
这是一个例子
bash_script.sh:
#!/bin/bash
echo Hello World
.bashrc
export HELLO_WORLD=$(bash_script.sh)
答案1
脚本由非交互式 shell 执行,而.bashrc
仅由交互式 shell 自动获取。
不过,有一种方法可以触发无限循环。每一个 bash
shell,无论是否交互式,都会检查变量是否BASH_ENV
已设置,如果设置了,则使用其值作为源文件的名称。在这种情况下,bash
从该文件执行脚本将导致无限循环,因此必须采取这些措施。但实际上,该脚本(正如其名称所示)仅用于设置 shell 使用的环境变量,而不是执行任意代码。
答案2
好吧,我想出了如何做到这一点。在 .bashrc 中只需执行以下操作:
export HELLO_WORLD=$(source bash_script.sh)
答案3
您无需执行任何操作。简单地启动 bash 脚本不会导致您的.bashrc
被调用。
只有.bashrc
当 bash 是交互式的时候,你的 will 才会被调用。当您启动脚本时,该脚本不是交互式的。
从 bash 手册页:
交互式 shell 是一种不带非选项参数且不带 -c 选项的 shell,其标准输入和错误都连接到终端(由 isatty(3) 确定),或者是一种使用 -i 选项启动的 shell。如果 bash 是交互式的,则 PS1 已设置并且 $- 包括 i,允许 shell 脚本或启动文件测试此状态。
这里重要的一点是“在没有非选项参数的情况下启动”。当您启动脚本时,bash 的第一个参数是该脚本的路径。因此它有一个非选项参数并且不是交互式的。
答案4
将其作为第 1 行:
[ -z "$PS1" ] && return # If not interactive, exit