如何在 Linux 命令行中将文件的特定行作为命令流水线化?

如何在 Linux 命令行中将文件的特定行作为命令流水线化?

我正在尝试在 bash 中执行文本文件的特定行。我想知道是否可以在不将该行复制到新文件中并执行它的情况下做到这一点?

答案1

基于@kev的答案(无需管道传输到新的bash):获取他的脚本源

script.sh

echo hello
echo world
echo foo
echo bar

并执行里面的某一行$(...)

命令:

$(sed -n '3p' script.sh)

它将foobash中打印您当前的 shell。

答案2

script.sh

echo hello
echo world
echo foo
echo bar

命令:

sed -n '3p' script.sh | bash

它将打印foo

答案3

如果你正在谈论 shell 脚本,你可以像本例中那样做:

#!/bin/bash
LINE='less'
#...
LINE="$LINE myfile.txt"
# now we execute that:
$LINE

另一个示例包括捕获输出以进行进一步处理:

#!/bin/bash
LINE="grep foo bar.txt"
OUTPUT=$($LINE)

在第二个示例中,变量$OUTPUT包含执行命令的结果grep

答案4

你可以但可能不应该。创建一个包含函数的库并获取它的源代码。这是一个非常不寻常的要求。Bash 有实际的控制流手段 - 不需要从文件中抓取代码字符串来执行。这可能很危险。

这是一个“玩具”示例,不适用于生产用途......

#!/usr/bin/env bash

shopt -s extglob

# evalLine filepath line-number
evalLine() {
    [[ -f $1 && $2 == +([[:digit:]]) ]] || return 1
    local x
    # This subtraction compensates for a bug that's since been fixed in 4.2.35 
    mapfile -ts $(($2 - 1)) -n 1 x &&
    ${x:+eval "$x"}
} <"$1"

evalLine /dev/stdin "$1" <<"EOF"
echo "line 1"
f() { echo "$1"; }; f "line 2"
var3='line 3' eval 'echo "$var3"'
EOF

后期编辑:请注意关于 中的一个错误的评论mapfile

相关内容