能否在eval变量中实现扩展?执行报错问题咨询
解决eval赋值时大括号扩展的报错问题
你的命令报错的根本原因是:eval VAR=echo some/path/{file1,file2}``执行时,命令替换echo some/path/{file1,file2}会先被shell处理成echo some/path/file1 some/path/file2,echo输出这两个字符串后,eval拿到的内容是VAR=some/path/file1 some/path/file2。此时eval会把它解析成两个操作:
- 给变量VAR赋值为
some/path/file1 - 尝试执行
some/path/file2这个可执行文件(因为它是独立的命令词)
而some/path/file2不存在,所以触发了“No such file or directory”的报错。
要实现将VAR设置为some/path/file1 some/path/file2的效果,完全不需要用echo和eval的组合,有更简单且安全的方式:
方法1:直接利用shell大括号扩展赋值
VAR=some/path/{file1,file2}
shell会直接将大括号扩展为两个路径字符串,赋值给VAR,不管对应的文件是否存在,最终VAR的值就是some/path/file1 some/path/file2。
方法2:如果必须使用eval(复杂场景)
如果因为某些限制必须用eval,需要把完整的赋值语句用引号包裹,让eval内部的shell处理大括号扩展,避免拆分命令:
eval 'VAR=some/path/{file1,file2}'
单引号会阻止当前shell提前解析大括号,让eval内部的shell完成扩展,最终VAR会被正确赋值为两个路径的组合,不会触发文件执行的错误。
注意:eval本身存在安全风险,除非必要,尽量避免使用,直接用方法1的赋值方式更简洁可靠。
内容的提问来源于stack exchange,提问作者myself600
相关产品推荐
相关产品推荐

