如何从管道运行命令

时间:2019-03-12 04:55:06

标签: bash shell

我想在管道外运行“历史记录”或“!23”之类的命令。

  1. 我该如何实现?
  2. 为什么以下命令不起作用?
echo "history" | xargs eval $1

2 个答案:

答案 0 :(得分:2)

首先要回答(2):

  • historyeval都是bash内置函数。因此xargs无法运行它们中的任何一个。
  • xargs不使用$1自变量。 man xargs获取正确的语法。

对于(1),执行您要尝试的操作实际上没有多大意义,因为shell历史记录不太可能在调用之间同步,但是您可以尝试执行以下操作:

{ echo 'history'; echo '!23'; } | bash -i

或:

{ echo 'history'; echo '!23'; } | while read -r cmd; do eval "$cmd"; done

请注意,管道在子Shell中运行。不保留环境更改:

x=1; echo "x=2" | while read -r cmd; do eval "$cmd"; done; echo "$x"

答案 1 :(得分:0)

您可以尝试这样 首先将历史记录命令重定向到一个文件(剪切出行号)

history | cut -c 8- > cmd.txt

现在创建此脚本hcmd.sh(此Read a file line by line assigning the value to a variable的参考)

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
    $line
done < "cmd.txt"

像这样运行它

./hcmd.sh