我在 Ubuntu 中运行 Nginx。我正在尝试编写一个脚本来从 Nginx 缓存中删除一个项目。
脚本:clear_single_cache_object.sh
#!/bin/bash
echo "Deleting: " $1
grep -lr $1 /path/to/cache/* | xargs rm
echo "Done"
该脚本位于我的主目录中,我在终端中执行该脚本如下:
sh clear_single_cache_object.sh '/images/test.jpg'
输出如下:
Deleting: /images/test.jpg
: No such file or directory
Done
换句话说,脚本不起作用,并且该项目尚未从缓存中删除。我也尝试以 root 身份运行该脚本。
如果我在终端中输入以下命令,那么它可以正常工作并且该项目将从缓存中删除。
grep -lr '/images/test.jpg' /path/to/cache/* | xargs rm
为什么我运行脚本没有效果呢?我怀疑和脚本中的“|xargs rm”部分有关。
答案1
第一的,格伦·杰克曼接近:您的脚本使用了 CR-LF ( \r\n
) 行尾。例如,我手动使用 CRLF 行尾重新创建了您的脚本:
$ cat foo.sh
#!/bin/bash
echo "Deleting: " $1
grep -lr $1 foo.txt | xargs echo
echo "Done"
$ file foo.sh
foo.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
$ sh foo.sh bar
Deleting: bar
: No such file or directory
Done
dos2unix
通过安装并使用它来转换,将行尾更改为正常形式:
sudo apt-get install dos2unix
dos2unix clear_single_cache_object.sh
其次,既然你给出了一个shebang,为什么还要用 调用你的脚本sh
?使其可执行并直接运行它:
chmod +x clear_single_cache_object.sh
./clear_single_cache_object.sh /images/test.jpg
如果你这样做了,你就能更早地发现问题:
$ ./foo.sh
bash: ./foo.sh: bad interpreter: /bin/bash^M: no such file or directory
第三,修复编辑器。如果您在 Windows 上创建脚本,然后将其复制到服务器,请使用支持 Unix 行尾 (LF) 的像 Notepad++ 这样的编辑器。