我正在制作一个脚本,该脚本从包含每行我最常用的长命令的文件中执行特定行(长命令的某种书签)。
例如,我有一个文件,第一行是:
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
,与我上面刚刚说的相同:它打开图像查看器,但说“给定位置不包含图像”。但是,如果我关闭该图像查看器,则终端也将关闭。
由于您的文件包含有效命令,因此您可以根据需要使用以下任何命令:
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] 删除。
我来说两句