我写了一个bash脚本来制作一个“ shell”,在执行命令之前和之后打印日期:
while true
do date
printf "Prompt: "
read x
date
$x #Solution: this should be eval "$x"
done
问题在于此“外壳”无法识别$ x中的变量,因此例如echo $PWD
输出$PWD
而不是当前目录。一个相关的结果是cd
不起作用。如何解决/解决这个问题?谢谢。
编辑:已解决。谢谢大家:-)
后期编辑:实际上,上述解决方案并不完全;我需要在-r
命令中添加read
选项,以防止过早评估反斜杠序列。此外,在这种情况下,双引号毕竟似乎是多余的(因为除非$x
为空,并且"$x"
之前的$x
和eval
会扩展到同一行)在没有参数的情况下执行的操作与在空字符串中执行的操作一样,但没有参数),但我认为始终将引号包括在内是安全和良好样式的问题。
答案 0 :(得分:3)
如果您只是想打印出前后的日期,可以使用PROMPT_COMMAND="$(date)"
中的.bashrc
进行打印。这将在命令提示符之前打印日期(这意味着它在功能上也将在命令之后),因为在命令完成后会出现提示。它与PS1
位于单独的一行,但是如果您愿意,可以将其添加到PS1
中。
如果您尝试输入文字echo $PWD
并让x
给出其值,则可以执行eval "$x"
,但大多数人建议不要使用{{1} },因为任何人都可以输入任何内容,例如eval
如果您尝试将x设置为变量的名称,即sudo rm -rf / --no-preserve-root
,并且想要获取x=PWD
的值,则可以执行PWD
。这称为“间接”。