【发布时间】:2019-07-03 14:59:11
【问题描述】:
我正在尝试运行一个脚本来监视不同的文件夹和文件,如果它们发生变化,请执行一个命令。其中一个文件夹路径接受一个动态变量,该变量将根据在 CLI 中运行脚本时输入的内容而改变,而另一个则不会改变。
但是,根据文件路径,需要采取不同的操作。
#!/usr/bin/env bash
THEME=$1
while true;
do
echo "inside find"
find code/themes/$THEME/src -name '*.html' -o -name '*.ts' -o -name '*.scss' | entr -d rsync -avh code/themes/$THEME/* ./
find code/base/src -name '*.html' -o -name '*.ts' -o -name '*.scss' | entr -d rsync -avh code/base/* ./
done
当我运行脚本时发生的事情是它只执行并将手表放在第一个 find 上(在上面粘贴的代码示例中,仅动态路径)。
目前我的问题是:
- 只有第一个 find 被调用,并且只有一个 watch 放置在 code/themes/$THEME/src 路径上
- 第二个发现永远不会被执行
如何让两者同时运行?或者,我怎样才能在一行中写完?
另外,我以前从未编写过脚本或使用过 bash,所以如果您对重构有任何建议或能够帮助解决我的问题,请在技术解释方面保持温和。
我的主要目标是:
- 我想设置一个监视路径代码/主题/$THEME/src 中的任何更改
- 我想设置一个监视路径代码/base/src 中的任何更改
- 我希望两个观察者同时运行
【问题讨论】:
-
entr显然来自this answer,您被定向到yesterday. -
我不熟悉
entr,但如果我没看错的话,它会运行第一个find和entr管道,然后运行第二个find并坐在那里等待任何列出的文件都可以更改。 -
顺便说一句,您应该在
$THEME周围使用双引号,或者实际上使用小写的变量名(大写保留给系统使用)。即使您从未期望参数包含 shell 元字符,如果您尝试传入需要引用的参数,当您使用不带引号的参数时,错误消息也会令人困惑。进一步查看When to wrap quotes around a shell variable? -
@tripleee 是的,在您提到与我的其他问题类似的问题后,我正在玩 entr。现在在基于路径的不同命令的多个查找中面临这个问题。感谢您对语法约定的建议。我会执行的。
-
也许你应该更详细地解释你希望发生的事情。这些顺序执行是否有原因?如果您有两个彼此独立运行的
while循环会怎样?