在shell脚本中重定向IO

时间:2014-03-31 10:21:32

标签: bash shell

我试图以递归方式展开目录中的所有.css个文件。我使用的是beautifier(node.js工具)。它应该获取文件名,扩展其内容,并将结果写入stdout。所以以下几行很好地完成了这项工作:

./node_modules/.bin/beautifier ./css/foo.css > ./css/bar.css 

但是当我将所有内容放入脚本中时,它只是将所有输出打印到stdout并在退出后将所有文件留空:

echo "Expanding CSS files..."
for css in `find . -type f -name \*.css -print`
do
    echo "Expanding $css"
    temp="$css.tmp"
    cp $css $temp
    ./node_modules/.bin/beautifier $temp>$css 
    rm $temp
done

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

这不是一个真正的答案,但是你的脚本会再次错误地用空格分割文件。你应该做类似下面的事情

#!/bin/bash
echo "Expanding CSS files..."
while IFS= read -r -d '' css
do
   echo "Expanding $css"
   temp="$css.tmp"
   echo cp "$css" "$temp"
   echo ./node_modules/.bin/beautifier "$temp" '>' "$css"
   echo rm "$temp"
done < <(find . -type f -name \*.css -print0)

我把echo放在任何地方,引用>左右,所以除了告诉你它会做什么之外,它实际上并没有做任何事情。还可以执行#!/bin/bash -x,这将显示执行命令时正在执行的操作。

答案 1 :(得分:0)

将变量放在""中可以解决问题

echo "Expanding CSS files..."
for css in `find . -type f -name \*.css -print`
do
   echo "Expanding $css"
   temp="$css.tmp"
   cp $css $temp
   ./node_modules/.bin/beautifier "$temp" > "$css" 
   rm $temp

done

编辑:真正的问题是>之间没有空格。但正如@Biffen指出的那样,这是一个很好的做法。如果这条线是这样的,

"$temp">"$css"

错误引发:

unexpected EOF while looking for matching `"'
syntax error: unexpected end of file

因此调试起来更容易。

虽然我的回答有效,但@Briffen被发现是真正的错误,应归功于他。