从文件的特定行执行命令

用户名

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

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

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,与我上面刚刚说的相同:它打开图像查看器,但说“给定位置不包含图像”。但是,如果我关闭该图像查看器,则终端也将关闭。

希恩

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

  • 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\Infographic/blender-3d-cheatsheet.png作为第二和第三参数来调用。显然,这两个文件不存在。

  • "$(sed -n "1 p" /path/to/that/file)"是一个单词,即可执行文件是整行,并且不使用任何参数调用。显然该命令不存在。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章