linux - Word 未扩展为 bash 中的 shell 命令

标签 linux bash shell scripting

有人可以帮忙吗:

我想通过从另一个文本文件中读取它们来在 shell 脚本中执行一些命令,如下所示:

command_file.txt 包含:

EXECUTED_OK_$(date)
EXECUTED_OK_$(hostname)

shell脚本.sh

#!/bin/sh

while read command
do
echo $command 
done < command_file.txt

我的问题是,echo 按命令文件中的文本打印。 我怎样才能让它展开并打印实际日期和主机名。

例如 预期输出应该是:

EXECUTED_OK_22-02-2010 11:10:10
EXECUTED_OK_localhost

但是我得到:

EXECUTED_OK_$(date)
EXECUTED_OK_$(hostname)

最佳答案

这种白名单方法不允许执行任意代码,如 eval做。如果安全不是问题,您应该坚持使用 eval ,因为此示例中使用的外部有许多极端情况,对于这些情况,替换将无法按预期工作。

程序在打印命令之前用它们的输出替换命令文件的每个命令中引用的某些外部对象:

#!/bin/bash

while read command
do
    while read -a external ; do
        output=$( "${external[@]}" )
        command=$( sed "s/\$(${external})/${output}/g" <<< "$command" )
    done <<END
    date -R
    hostname
END
    echo "$command"
done < command_file.txt

要使用更多外部组件,您需要将它们添加到 <<END 之间的 heredoc 中和 END .我添加了 -Rdate展示带有参数的外部。

正如已经指出的那样,除了分词之外,不会对外部命令进行任何处理(例如引号、替换)(空格可以转义(one\ two)而不是引号)。

关于linux - Word 未扩展为 bash 中的 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56244924/

相关文章:

node.js - bash:create-react-app:找不到命令(很确定这是我的 $PATH)

bash - 这些重定向和文件描述符的目的是什么?

c++ - Sigaction 的替代方案

linux - 内核模块配置锁定内置?

linux - tail 文件 - 该文件变得不可访问然后又出现了

linux - subprocess.Popen : does not retun complete output , 当通过 crontab 运行时

linux - Bash ASCII 实现

linux - Linux 上 clearcase 动态 View 中的额外目录条目

linux - 捕获错误并要求在 BASH 中手动输入

Bash 等待进程启动