当我写入控制台时,例如这样:
echo -e "directory content: \n $(ls -l)"
我会得到这样的东西:
directory content:
-rw-rw-r--. 1 user user 0 Apr 9 10:28 file.txt
没关系,但是我希望在一个文件中有“目录内容:\ n $(ls -l)”并写入bash脚本,该文件将被读取并将其内容与执行的脚本一起回显到另一个文件。
我写了这个简单的脚本
#!/bin/bash
FILE=$(<file.txt)
echo -e "$FILE"
不幸的是,猫可能会逃脱角色,所以在执行后我得到了这个
directory content:
$(ls -l)
有没有办法如何获得正确的结果?
答案 0 :(得分:1)
FILE=$(<file.txt)
这会将file.txt
的文字内容放入FILE
。从那时起,file.txt
的内容 - 包括$()
部分 - 被视为字符串,仅此而已。你没有得到ls
执行的原因不是一些字符转义,而是没有执行FILE
所涉及的内容。
你想要什么 - 字符串的内容的执行 - 通常被认为是一个明显的安全漏洞(因为你的脚本没有完全控制file.txt
的内容,即对代码注入开放。例如Perl通过eval
明确允许这个; 我知道bash 没有这样的功能(如fredtantini所指出的那样)这对于bash也是可能的......对他来说是+1。 (虽然我很确定这是不是最佳做法,原因如下。)
答案 1 :(得分:1)
您可以尝试:
bash-3.2$ cat file.txt
directory content: \\n $(ls -l)
bash-3.2$ MYFILE=$(<file.txt)
bash-3.2$ eval echo -e "$MYFILE"
directory content:
total 8 -rw-r--r-- 1 fti staff 32 09 avr 12:40 file.txt
不确定是否是最好的做法。
答案 2 :(得分:0)
您正在将代码与数据混为一谈:不要这样做。相反,创建一个shell脚本并源或执行它。
$ cat file.sh
echo directory content:
ls -l
$ . file.sh
directory content:
-rw-rw-r--. 1 user user 0 Apr 9 10:28 file.txt
$ MYFILE=$( bash file.sh )
$ echo "$MYFILE"
directory content:
-rw-rw-r--. 1 user user 0 Apr 9 10:28 file.txt