从脚本中,我如何检查交互式 shell 中是否存在函数?
From a script, how can I check if a function would exist in an interactive shell?
我正在为一些包装脚本编写安装文件,并将这些脚本映射到底层命令的完成。
在我的 .bash_profile 中,这将 git 的完成映射到 git_wrapper:
complete -F _git git_wrapper
在我的 setup.sh 中,以下内容不起作用,因为脚本不是交互式的(type _git
失败,因为 _git
在非交互式 shell 中不可用):
if type _git &>/dev/null && ! grep "complete.*_git git_wrapper" ~/.bash_profile &>/dev/null ; then
echo "complete -F _git git_wrapper" >> ~/.bash_profile
fi
在 setup.sh 中,我如何检查 _git 完成是否可用于交互式 shell?
From a script, how can I check if a function would exist in an interactive shell?
您可以通过 运行 一个交互式 shell(见下文)和 looking for it.[=14= 测试函数是否存在于交互式 shell 中]
请注意,"interactive" 是此处定义的术语。一方面,如果 shell 在没有任何非选项参数且没有 -c
选项的情况下启动,则它是 "interactive",并且它的标准输入和错误都连接到终端。这很自然,但对您的目的不是很有用。但是,另一方面,如果 shell 以 -i
选项启动,那么 也是 "interactive",所有其他考虑都放在一边。您的脚本可以使用它在交互式子 shell 中执行测试,但也许更有用的是,您可以使用它在交互式 shell 中使用它来制作部分或全部脚本本身 运行 .
我正在为一些包装脚本编写安装文件,并将这些脚本映射到底层命令的完成。
在我的 .bash_profile 中,这将 git 的完成映射到 git_wrapper:
complete -F _git git_wrapper
在我的 setup.sh 中,以下内容不起作用,因为脚本不是交互式的(type _git
失败,因为 _git
在非交互式 shell 中不可用):
if type _git &>/dev/null && ! grep "complete.*_git git_wrapper" ~/.bash_profile &>/dev/null ; then
echo "complete -F _git git_wrapper" >> ~/.bash_profile
fi
在 setup.sh 中,我如何检查 _git 完成是否可用于交互式 shell?
From a script, how can I check if a function would exist in an interactive shell?
您可以通过 运行 一个交互式 shell(见下文)和 looking for it.[=14= 测试函数是否存在于交互式 shell 中]
请注意,"interactive" 是此处定义的术语。一方面,如果 shell 在没有任何非选项参数且没有 -c
选项的情况下启动,则它是 "interactive",并且它的标准输入和错误都连接到终端。这很自然,但对您的目的不是很有用。但是,另一方面,如果 shell 以 -i
选项启动,那么 也是 "interactive",所有其他考虑都放在一边。您的脚本可以使用它在交互式子 shell 中执行测试,但也许更有用的是,您可以使用它在交互式 shell 中使用它来制作部分或全部脚本本身 运行 .