我正在制作一个脚本,该脚本从每行包含我最常用的长命令的文件中执行特定行(长命令的某种书签)。
例如,我有一个文件的第一行是:
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
,因为灾难带来了灾难(我实际上并不理解)。
我的任务是:
eval
以外,是否有任何解决方案可以将文件中的特定行作为命令执行?非常感谢你们...
编辑:尝试过exec
,与我上面刚刚说过的相同:它打开了图像查看器,但说“给定位置不包含图像”。但是,如果我关闭该图像查看器,终端也将关闭。
答案 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
是一个单词,即可执行文件是整行,并且不使用任何参数进行调用。显然该命令不存在。