Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在进入目录时自动运行bash脚本?_Bash - Fatal编程技术网

如何在进入目录时自动运行bash脚本?

如何在进入目录时自动运行bash脚本?,bash,Bash,我正在使用rvm和bundler对我的所有项目进行沙箱处理,因此它们都非常独立,并且它们的所有依赖项都可以保存在源代码管理中。在其中一个示例中,我使用保存在/bin文件夹中的bin运行项目。因此,我需要将其添加到PATH变量中。但是,我希望这在项目路径中的文件中完成,因此它是自动完成的 这是我的脚本,它位于名为“.runme”的文件中: 我可以让它在进入它所在的文件夹时自动运行吗?如果您能够向每个需要此功能的用户的.bashrc文件中添加内容,您可能可以挂接到cd操作以检查您需要的内容 还有一个

我正在使用rvm和bundler对我的所有项目进行沙箱处理,因此它们都非常独立,并且它们的所有依赖项都可以保存在源代码管理中。在其中一个示例中,我使用保存在/bin文件夹中的bin运行项目。因此,我需要将其添加到PATH变量中。但是,我希望这在项目路径中的文件中完成,因此它是自动完成的

这是我的脚本,它位于名为“.runme”的文件中:


我可以让它在进入它所在的文件夹时自动运行吗?

如果您能够向每个需要此功能的用户的
.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

}