【发布时间】:2021-10-06 05:47:45
【问题描述】:
我的 apache 目录中有一个 bash 脚本,用于下载一些图片并对其进行优化。
我的脚本路径在:/var/www/site/storage/optimazer/photo_optimazer.sh
此脚本从txt 文件中获取一些命令并将其传递给wget
#!/usr/bin/env bash
..
THREAD="$(cat ${THREAD_FILE})";
$(command -v wget) $THREAD
...
${THREAD_FILE}的内容:
$ cat "${THREAD_FILE}"
--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0" -np -r -l 1 -A "jpg" --ignore-case -P /var/www/optimazer/public/optimazed -x http://example.com
我尝试使用在 /usr/local/bin/optimaze.sh 创建的另一个 bash 来执行此 bash
我不得不这样做,因为它会与系统服务一起运行。
这是/usr/local/bin/optimaze.sh的内容
#!/usr/bin/env bash
cd /var/www/site/storage/optimazer/
$(command -v bash) photo_optimazer.sh
现在,当我执行 optimaze.sh 时,它会在我的 ${THREAD} 内容中添加一些额外的引号并破坏脚本,我得到了一些类似这样的错误:
--2021-07-30 12:56:59-- http://(windows/
Resolving (windows ((windows)... failed: Name or service not known.
wget: unable to resolve host address ‘(windows’
--2021-07-30 12:56:59-- http://nt/
Resolving nt (nt)... failed: Name or service not known.
wget: unable to resolve host address ‘nt’
--2021-07-30 12:56:59-- http://10.0;/
Resolving 10.0; (10.0;)... failed: Name or service not known.
wget: unable to resolve host address ‘10.0;’
--2021-07-30 12:56:59-- http://win64;/
Resolving win64; (win64;)... failed: Name or service not known.
wget: unable to resolve host address ‘win64;’
--2021-07-30 12:56:59-- http://x64;/
Resolving x64; (x64;)... failed: Name or service not known.
wget: unable to resolve host address ‘x64;’
--2021-07-30 12:56:59-- ftp://rv/90.0)
=> ‘/var/www/scraper/public/***/3/rv/.listing’
Resolving rv (rv)... failed: Name or service not known.
wget: unable to resolve host address ‘rv’
--2021-07-30 12:56:59-- http://gecko/20100101
Resolving gecko (gecko)... failed: Name or service not known.
wget: unable to resolve host address ‘gecko’
--2021-07-30 12:56:59-- http://firefox/90.0%22
Resolving firefox (firefox)... failed: Name or service not known.
wget: unable to resolve host address ‘firefox’
我在 photo_optimazer.sh 中尝试set -ex 看看发生了什么
wget '--user-agent="Mozilla/5.0' '(Windows' NT '10.0;' 'Win64;' 'x64;' 'rv:90.0)' Gecko/20100101 'Firefox/90.0"' -np -A '"jpg,png"' --ignore-case --ignore-length -P /example/path -x http://example.com
它在我的${THREAD} 输出中添加了单引号,我不知道为什么!
我用GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
【问题讨论】:
-
这与BashFAQ #50 中描述的问题非常相似。
-
顺便说一句,你到底为什么要使用
$(command -v wget)而不仅仅是wget?它速度较慢(所有命令替换都需要分叉一个子进程),并且没有任何好处(事实上,它停止 shell 无法记录并稍后重用wget的位置,因为它使查找发生在子shell中,所以一旦子shell退出,shell的内存状态就会全部丢失)。 -
顺便说一句,
set -e不一定是个好主意。我强烈建议您完成BashFAQ #105 中的练习,如果不阅读上面的寓言的话。 -
对——如果 OP 不接受描述更好的参数列表存储格式的答案,那么他们的问题归结为按字面意思解析这些引号,这会使问题与以上。
标签: linux bash shell unix centos