在打开文件夹或更改内容时运行bash脚本

在打开文件夹或更改内容时运行bash脚本,bash,Bash,如果我有一个存储在文件夹中的bash脚本,是否可以在打开文件夹时运行它 第一个例子 假设我在共享文件夹中有脚本s(例如on)foo,每当用户键入 cd /path/to/foo 我想显示一条消息,让我们说你好,访客。我怎样才能做到(如果我能做到的话) 我已经看过这个问题了,但我没有找到答案中所说的例子 如果用一种简单的方法无法实现,是否可以在检测到文件夹内容更改时运行相同的脚本,或者我是否需要另一个脚本来检查,然后运行前者 第二个例子 相同的脚本s位于相同的共享foo文件夹中。如果我做了类似

如果我有一个存储在文件夹中的bash脚本,是否可以在打开文件夹时运行它

第一个例子 假设我在共享文件夹中有脚本
s
(例如on)
foo
,每当用户键入

cd /path/to/foo
我想显示一条消息,让我们说
你好,访客。我怎样才能做到(如果我能做到的话)

我已经看过这个问题了,但我没有找到答案中所说的例子


如果用一种简单的方法无法实现,是否可以在检测到文件夹内容更改时运行相同的脚本,或者我是否需要另一个脚本来检查,然后运行前者

第二个例子 相同的脚本
s
位于相同的共享
foo
文件夹中。如果我做了类似的事情

touch test.txt
foo
文件夹中,我想显示另一条消息,比如说
您创建了一个新文件或根据该文件夹的标准重命名文件



使用此配置,我必须确保无论谁进入该文件夹都会触发脚本,但我无法重新定义任何内置函数,也无法修改bash文件。

这可能不是一个好主意,但是的,您可以按照您所描述的做。在用户的
.bashrc
中,可以添加以下内容:

function cd ()
  { builtin cd "$@" ; if [[ $PWD = /path/to/foo ]] ; then ./s ; fi ; }

(不用说,这有很多警告和限制。您正在修改基本的Bash行为,这通常不是一个好主意。)

另一种方法是,在.bashrc中添加类似的内容:

export CURPROMPTWD="$PWD"
export PROMPT_COMMAND=detect_dir_change

function detect_dir_change()
{
    local newcwd=$(realpath "$PWD")
    if [[ "$CURPROMPTWD" != "$newcwd" ]]
    then
        CURPROMPTWD="$newcwd"

        #### EDITED FOR COMMENT ####
        if [[ "$newcmd" == "/some/specific/path" ]]; then
            ./run_welcome.sh
        fi
    fi
}
请注意,我使用了系统上可能不可用的
realpath
。它旨在避免检测到从“~”到“/home/user”到“/user”等目录的更改

该示例使用一个简单的检测来检测用户何时更改为Git worktree根,并使用Git本身来显示该树的状态

检测变化: 您可以使用find对其进行调整。我建议使用一些限制器(-maxdepth和-mmin,如下所示)来防止这成为资源消耗。我确信在使用inotify时会有更多的性能选项(但我不确定它们是否可以从bash轻松访问)


可能重复的Re:edit;如果在DROBox上浏览的任何东西都具有运行任意代码的能力,我会认为这是一个宽泛的安全漏洞。不,原则上这是不可能的。但这只限于我重新定义cd的机器,不是吗?如果我想让它独立于此呢?@Marcellomasaro:我不明白你的意思。当然,你所做的任何事情都只会影响你在上面做的机器。很抱歉,我不清楚,我将用一个更具体的示例更新这个问题。我想检测一个特定的已访问文件夹,因此我应该用一个固定的文件夹替换
$newcwd
。但是,这仍然与特定的机器有关。我能让它独立于此吗?@Marcellomasaro:呃。。。当然请参见编辑以供评论的
########
。关于绑定到特定机器的
我完全迷路了。我所做的一切都与机器无关。它只与一个.bashrc绑定。请随意从您感兴趣的所有系统上运行的任何脚本中获取它:)很抱歉,不太清楚,我已经更新了示例以更好地表达自己的意思:P但是我没有得到编辑评论的
#########
东西。。。
export CURPROMPTWD="$PWD"
export PROMPT_COMMAND=detect_dir_change
export CURPROMPTCHANGEID=""

function detect_dir_change()
{
    local newcwd=$(realpath "$PWD")
    if [[ "$CURPROMPTWD" != "$newcwd" ]]
    then
        CURPROMPTWD="$newcwd"
        if [ -d .git/ ]; then
            echo "Welcome into you git working tree at $newcwd"
            git status
        fi
    fi

    # due to 
    # * -maxdepth 3, changes lower than 3 levels deep below the working
    #   directory won't be seen
    # * -mmin -10, changes made longer than 10 minutes ago won't be seen; this
    #   also implies that being idle in a workdir for over 10 minutes will be
    #   detected as a 'modified working directory' (for the simple reason that
    #   is has no changeid in that case and it will compare as _unequal_ to the
    #   last-seen changeid)
    #
    # Feel free to drop both -maxdepth or -mmin if that's not
    # appropriate/necessary for your use case
    #
    # Consider adding '-type f' to only take modifications to files into
    # account. 
    # --> However, in that case, you'd probably want to watch -cmin _as well
    #     as_ -mmin (since new files won't be seens as recently modified :))
    local changeid=$(find -maxdepth 3 -mmin -10 -printf '%T+\t%i\0' | sort -z | xargs -0 -n1 | tail -1)
    if [[ "$CURPROMPTCHANGEID" != "$changeid" ]]
    then
        CURPROMPTCHANGEID="$changeid"
        echo Run some update due to recent changes
    fi
}