我使用ufraw:
使用快速脏的bash脚本批量转换一些图片IFS=$'\n'
PICS="/media/disk/kevin/Images/";
for pic in $(find $PICS -name "*CR2");
do
ufraw-batch $pic --out-type jpg --size=2048 --overwrite --out-path=$PICS;
rm -f $pic
done;
IFS=" ";
使用通常的权限运行正常,但是如果我运行它:
sudo ./convert.sh
我遇到了这个奇怪的错误:
find: "/media/disk/kevi" : no such file or directory.
我做到了:
IFS=$'\n'
PICS="/media/disk/kevin/Images/";
echo PICS;
然后我惊讶地发现:
/media/disk/kevi /Images/
WTF?
答案 0 :(得分:3)
你结束了$IFS
"n"
;它不是将\n
解释为换行符,而是将其无意义地转义n
。我隐约怀疑你是否正在为$IFS
根目录进行某种记录不明的保护(因为它是一个众所周知的漏洞利用向量),但你可能想尝试在你的文件中嵌入一个文字换行符而不是符号符号。脚本使用 ctrl - v 输入。
答案 1 :(得分:2)
如果您的脚本中没有明确的#!
行,那么sudo-ed命令可能会在/bin/sh
而不是/bin/bash
下运行,如果您'在最近的Linux系统上重新运行,/bin/sh
可能是dash
而不是bash
。破坏者的维护者认为IFS不应该解释转义序列(例如,参见here
)。
$ more convert.sh
IFS=$'\n'
PICS="/media/disk/kevin/Images/";
echo $PICS;
ps
$ ./convert.sh
/media/disk/kevin/Images/
PID TTY TIME CMD
30827 pts/0 00:00:01 bash
32042 pts/0 00:00:00 bash
32043 pts/0 00:00:00 ps
$ sudo ./convert.sh
/media/disk/kevi /Images/
PID TTY TIME CMD
32044 pts/0 00:00:00 sh
32045 pts/0 00:00:00 ps
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2009-08-06 19:10 /bin/sh -> dash
因此,您看到的行为仅与在root下运行间接相关。如果您明确使用破折号,您会看到相同的内容。另一种解决问题的方法是在脚本中包含一个明确的#!/bin/bash
。
答案 2 :(得分:0)
您的代码似乎有拼写错误。如果实际代码是IFS ='\ n'或IFS =“\ n”,则将分隔符设置为两个字符的列表,\和n。如果IFS = \ n,那么一个char A POSIX shell不会将\ n解释为LF。它与root无关。
$ BLAH='\n'
$ echo $BLAH
\n
$ BLAH="\n"
$ echo $BLAH
\n
$ BLAH=\n
$ echo $BLAH
n
$ BLAH="Both\n\and\aregone"
$ echo $BLAH
Both a d arego e