我遇到了将以下脚本的结果提取到文件的问题。当我运行以下脚本时,没有任何内容写入filecheck_output
文件。
#!/bin/bash
cd /var/www/html/images/
results="$(find projects -name "*.*" | sort -n)"
echo "${results}" > filecheck_output
脚本的名称是filecheck。当我从脚本末尾删除> filecheck_output
部分并从命令行运行./filecheck > filecheck_output
时,脚本会运行并将结果输出到filecheck_output
文件中而不会出现任何问题。
为什么在从命令提示符运行命令而不是在脚本中运行命令时,只会重定向输出?
答案 0 :(得分:1)
您的术语已关闭。您希望将输出重定向到文件。 pipe 某事意味着从一个命令获取输出并将其提供给另一个命令,就像你在find | sort
中所做的那样。
在临时变量中捕获结果简直就是浪费,所以你真的只是在寻找
find projects -name "*.*" | sort -n >filecheck_output
该脚本之前执行cd
,因此显然会在该目录中创建输出文件。如果您想避免这种情况,请不要cd
,或在子shell中执行cd
。
( cd somewhere; find projects ) | sort -n >filecheck_output
find somewhere/projects | sort -n >filecheck_output
在后一种情况下,find
的输出将在每个生成结果的路径中包含somewhere
。您可以使用sed
进行后处理以删除它,就像我在此处显示的那样,尽管这看起来比子shell解决方案更脆弱。
find somewhere/projects | sed 's%^somewhere/%%' | sort -n
不在脚本中进行重定向似乎是使其可重用的最佳方法;然后你可以在每次运行时选择不同的输出文件,如果你愿意的话,这样就可以使用它,例如在一组目录的while
循环中,或者其他任何内容。
答案 1 :(得分:0)
与其他人提到的一样,您需要将filecheck_ouput的完整路径或相对路径放入脚本中。
#!/bin/bash
cd /var/www/html/images/
results="$(find projects -name "*.*" | sort -n)"
echo "${results}" > /home/fedorqui/filecheck_output