如何在进入目录时自动运行bash脚本?
我正在使用rvm和bundler对我的所有项目进行沙箱处理,因此它们都非常独立,并且它们的所有依赖项都可以保存在源代码管理中。在其中一个示例中,我使用保存在/bin文件夹中的bin运行项目。因此,我需要将其添加到PATH变量中。但是,我希望这在项目路径中的文件中完成,因此它是自动完成的 这是我的脚本,它位于名为“.runme”的文件中:如何在进入目录时自动运行bash脚本?,bash,Bash,我正在使用rvm和bundler对我的所有项目进行沙箱处理,因此它们都非常独立,并且它们的所有依赖项都可以保存在源代码管理中。在其中一个示例中,我使用保存在/bin文件夹中的bin运行项目。因此,我需要将其添加到PATH变量中。但是,我希望这在项目路径中的文件中完成,因此它是自动完成的 这是我的脚本,它位于名为“.runme”的文件中: 我可以让它在进入它所在的文件夹时自动运行吗?如果您能够向每个需要此功能的用户的.bashrc文件中添加内容,您可能可以挂接到cd操作以检查您需要的内容 还有一个
我可以让它在进入它所在的文件夹时自动运行吗?如果您能够向每个需要此功能的用户的
.bashrc
文件中添加内容,您可能可以挂接到cd
操作以检查您需要的内容
还有一个关于如何连接到cd
操作的问题:
我不熟悉RVM,但他们似乎有一些关于连接到
cd
的文档:另一个技巧是将函数放入PS1
,如
export PS1='...\[$(.runme)\]
(用PS1中已有的内容替换…
)。这将在每次新提示时运行检查
不过,您需要使命令尽可能快地运行,因为它的运行时将延迟提示的显示。这方面的一个良好开端是使其成为bash函数,并且只使用bash内置函数,这样它就不必fork来运行任何外部程序(如
grep
) 这里有一个简单的别名,它的干扰性较小:
alias lx='PATH="./bin:$PATH"'
然后,您可以在任何具有bin
子文件夹的文件夹中使用lx
(本地执行),在那里执行脚本,而无需路径;e、 例如,要从当前目录执行脚本/bin/start server
,请运行:
lx start-server
如果要基于本地可执行文件启用选项卡完成,请将以下内容添加到bash配置文件(在OSX和Linux上测试):
#安装下面定义的自定义选项卡完成功能。
complete-F_complete_lx--lx
#lx:tab的命令完成函数完成中的可执行文件
#/bin子文件夹。
_完成{
#设置要在其中查找本地可执行文件的目录。
本地localExeDir='./bin'
#获取当前命令行标记。
本地标记=${COMP_WORDS[$COMP_CWORD]}
本地tokenLen=${#token}
#查找所有本地可执行文件。
读取-d'-ra localExes
您想在有人将“cd”放入目录时自动运行“.runme”脚本吗?谢谢Kannan-after_cd hook看起来很有希望。一个问题是,我在那里输入的任何代码都会在任何人将cd刻录到任何文件夹时运行,而不仅仅是项目文件夹,因此我需要添加某种测试,以确保它只发生在项目文件夹中。我现在倾向于不让它自动,而是在项目根目录中的一些明显的设置脚本中。你可以用你能输入的最小名称制作一个脚本,当你将cd放入新目录时,键入“t”(或其他什么),t脚本可以看到它是否在感兴趣的目录中,如果是,然后执行一些代码。祝你好运。是的,你需要添加一个测试(检查当前目录中是否有“.runme”文件,如果有,运行它)。但总的来说,我不希望它是自动的。+1用于链接到另一个SO问题,特别是$COMMAND\u PROMPT
方法;不要忘记,pushd
也会更改目录;RVM链路现在已断开rvm
确实重新定义了cd
函数,因此要小心冲突。这是可行的,但使用Bash的$PROMPT\u命令
变量可能更简洁:“如果设置了,该值将解释为在打印每个主提示符($PS1)之前执行的命令。”-
lx start-server
# Install the custom tab-completion function defined below.
complete -F _complete_lx -- lx
# Command-completion function for lx: tab-completes the executables in
# the ./bin subfolder.
_complete_lx() {
# Set the directory in which to look for local executables.
local localExeDir='./bin'
# Get the current command-line token.
local token=${COMP_WORDS[$COMP_CWORD]}
local tokenLen=${#token}
# Find all local executables.
read -d ' ' -ra localExes < <(find "$localExeDir" -maxdepth 1 -type f -perm -a=x -exec basename -a {} +;)
# Filter the list of local executables
# based on the current command-line token.
# Turn case-insensitive matching temporarily on, if necessary.
local nocasematchWasOff=0
shopt nocasematch >/dev/null || nocasematchWasOff=1
(( nocasematchWasOff )) && shopt -s nocasematch
COMPREPLY=()
for localExe in "${localExes[@]}"; do
if [[ ${localExe:0:$(( tokenLen ))} == "$token" ]]; then
COMPREPLY+=( "$localExe" )
fi
done
# Restore state of 'nocasematch' option, if necessary.
(( nocasematchWasOff )) && shopt -u nocasematch
}