从文件的特定行执行命令

时间:2018-10-01 13:16:48

标签: linux bash scripting

我正在制作一个脚本,该脚本从每行包含我最常用的长命令的文件中执行特定行(长命令的某种书签)。

例如,我有一个文件的第一行是:

eog -f ~/Pictures/Cheatsheet\ Infographic/blender-3d-cheatsheet.png

但是当我执行以下操作时:

$(sed -n "1 p" /path/to/that/file)

它打开图像查看器,但显示“给定位置不包含图像”。如果我打电话:

"$(sed -n "1 p" /path/to/that/file)"

它说“ zsh:没有这样的文件或目录...”

如果我像这样使用eval,效果很好:

eval $(sed -n "1 p" /path/to/that/file)

但是我读到某个地方应该避免使用eval,因为灾难带来了灾难(我实际上并不理解)。

我的任务是:

  1. 我上面写的行为是什么?
  2. 除了使用eval以外,是否有任何解决方案可以将文件中的特定行作为命令执行?

非常感谢你们...


编辑:尝试过exec,与我上面刚刚说过的相同:它打开了图像查看器,但说“给定位置不包含图像”。但是,如果我关闭该图像查看器,终端也将关闭。

1 个答案:

答案 0 :(得分:0)

由于文件包含有效命令,因此您可以根据需要使用任何这些命令:

  • source <(sed -n "1 p" /path/to/that/file)
  • eval "$(sed -n "1 p" /path/to/that/file)"
  • sed -n "1 p" /path/to/that/file | bash

“有效”是指如果我根据您的示例行进行判断,则可以正确转义。这意味着,如果一行包含类似eog -f /tmp/$file之类的内容,则我认为$并非故意转义,不是实际文件名的一部分,并且$file应该替换为file变量。

因此,使用eval是安全的,但是,另一方面,如果您未正确引用(并且您没有)引用$(sed -n "1 p" /path/to/that/file),则可能会遇到问题。示例:

$ line='printf "%s\n" "Four spaces = <    >"'

$ eval "$line"           # Correct output
Four spaces = <    >

$ eval $line             # Incorrect output
Four spaces = < >

$ IFS=%; eval $line      # Incorrect output
 s

关于您的其他尝试:

  • $(sed -n "1 p" /path/to/that/file)有相同的问题:行中每个用空格分隔的部分都变成了一个单词,因此eog~/Pictures/Cheatsheet\和{{1}调用}分别作为第二和第三参数。显然,这两个文件不存在。

  • Infographic/blender-3d-cheatsheet.png是一个单词,即可执行文件是整行,并且不使用任何参数进行调用。显然该命令不存在。

相关问题