我正在编写一个bash脚本(echoo.sh(,目的是在执行命令之前与命令相呼应。我在.bashrc内部摘下此脚本(echoo.sh(。但是,它并未执行使用Bash Shebang在脚本文件(TMP.SH(中运行的命令。以下是我到目前为止的代码
echoo.sh
#!/usr/bin/env bash
shopt -s extdebug; get_hacked () {
[ -n "$COMP_LINE" ] && return # not needed for completion
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # not needed for prompt
local this_command=$BASH_COMMAND;
echo $this_command;
};
trap 'get_hacked' DEBUG
当我打开外壳并运行任何命令时,它可以正常工作。但是对于脚本文件中的内容,它不起作用。
一些进一步的尝试:
- 我尝试在脚本文件(TMP.SH(中采购.bashrc文件 -
- 我在tmp.sh中采购了echoo.sh,它起作用了。
所以,我试图理解
- ,如果我只是在.bashrc中摘下脚本中运行的内容的脚本,为什么它不起作用?
- 为什么不进一步尝试#1时。
最后,我该怎么做,以使我不必在所有脚本文件中求解echoo.sh才能起作用。可以将我的脚本源在一个地方并更改某些设置以使其在所有情况下都有效。
是的i在.bashrc内部源代码(echoo.sh(。但是,它不会执行使用bash shebang
在脚本文件(tmp.sh(中运行的命令
壳可以在交互性或非相互关系上产生。当bash
作为交互式登录外壳调用时,如果该文件存在,则首先从文件/etc/profile
读取并执行命令。阅读该文件后,它以该顺序查找~/.bash_profile
,~/.bash_login
和~/.profile
,并从存在的第一个且可读的第一个命令中读取和执行命令。
当启动非登录外壳的交互式外壳时,bash
将从~/.bashrc
读取并执行命令,如果该文件存在。
当您使用解释器集运行shell脚本时,它将打开一个非相互作用的新子壳,并且在Shell选项中没有选项-i
设置。
仔细研究~/.bashrc
,您会发现一行说
# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return
这意味着在您要调用的脚本中,例如考虑使用-c
选项显式产生非相互作用外壳的情况,而-x
只是为了启用调试模式
bash -cx 'source ~/.bashrc'
+ source /home/foobaruser/.bashrc
++ [[ hxBc != *i* ]]
++ return
这意味着~/.bashrc
的其余部分由于此防护措施而没有执行。但是,这里有一个这样的选项可以使用BASH_ENV
环境变量定义的此类非相互作用案例读取启动文件。行为好像是执行此行
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
您可以定义文件并将其值传递给本地环境变量
echo 'var=10' > non_interactive_startup_file
BASH_ENV=non_interactive_startup_file bash -x script.sh
或完全运行外壳脚本,就好像产生了交互式非登录外壳一样。用-i
标志运行脚本。重复上面的示例,使用-i
标志通过现在~/.bashrc
文件将被采购。
bash -icx 'source ~/.bashrc'
将bash
中的解释器She-Bang设置为#!/bin/bash -i
因此,从上述推论中回答您的问题,
- ,如果我只是在.bashrc中摘下脚本中运行的内容的脚本,为什么它不起作用?
不会因为~/.bashrc
不能从非交互发射的外壳中采购。通过将-i
传递到脚本即bash -i <script>
- 为什么不进一步尝试#1时。
因为您完全依赖在这里阅读~/.bashrc
。当您在tmp.sh
中源源echoo.sh
时,其所有外壳配置都会反映在tmp.sh