在shell脚本中使用cd和cd - 命令在另一个目录中进行某些计算是一种好方法

时间:2015-05-22 15:57:10

标签: linux bash shell unix

我在我的shell脚本中使用cd进入某个计算目录并再次使用cd - 返回。这是一个好用的方法吗?我的剧本是:

input_dir=/home/abc/2001/01/
cd $input_dir
#Execute some programm with ifile.txt e.g.
awk '$1 > 99 {printf "%.2f" "$1"}' ifile.txt > ofile.tx 
cd -

还是我们应该经常提到路径名?像:

input_dir=/home/abc/2001/01/
awk '$1 > 99 {printf "%.2f" "$1"}' $input_dir/ifile.txt > $input_dir/ofile.txt

您能否建议是否有简单的方法来减少文本?

2 个答案:

答案 0 :(得分:3)

将它放在子shell中:

(cd "$input_dir" && exec awk '$1 > 99 {printf "%.2f" "$1"}' ifile.txt > ofile.tx)

因此,当子shell退出时,您将自动返回到原始目录,因为cd仅应用于该子shell(仅包含awk命令)。

exec确保您不会产生额外开销,因为它会导致子shell将其进程表条目替换为awk。 (有些shell会自动为子shell中的最后一个命令执行此操作。)

答案 1 :(得分:1)

限制给定计算的cd范围的常用技术是在子shell中运行命令,如下所示:

(cd "${inputdir}" && awk '…')

然而,这并不总是适用,因为子shell具有与父shell通信的有限方式。子shell引入了涉及以下资源的边界限制操作:

  • 工作控制
  • 变量
  • SIGNAL处理程序的

如果您需要在目录中进行计算以与父脚本的这些资源进行交互,您仍然可以使用子shell限定cd的范围,前提是您:

  • 使用命名FIFO让孩子通知所需的作业控制,变量,对父脚本的信号操作

  • 或重写计算,以便只在子shell中进行输入和简单处理,而父shell通过匿名管道读取和解释结果。