仅从另一个脚本获取脚本的一部分?

仅从另一个脚本获取脚本的一部分?

这可能永远不会是解决问题的最佳方法,但我想知道这是否可能。

就像是:

awk '/function_i_want_to_call/,/^$/{print}' script_containing_function | xargs source

function_i_want_to_call arg1 arg2 arg3

除了实际工作。

答案1

首先,您需要严格确定哪个命令将生成您想要采购的特定部件。举一个简单的例子,给定文件

var1=value1
var2=value2

您只能var1使用head -n1 filename.如果您愿意,这可以是任意复杂的管道。

然后运行:

source <( pipeline_of_arbitrary_complexity some_filename )

仅适用于bash.要在 POSIX 中执行此操作,我认为您需要创建一个临时文件。

答案2

在 bash/ksh 及类似文件中,您可以使用<()以避免创建子 shell |

资源管理器.sh:

echo hallo welt
echo hello world
echo ahoj světe

假设您只想将第二行放入源代码中:

. <( sed -n '2 p' < insourcable.sh )

(打印“你好世界”)

答案3

dotfn(){ . /dev/fd/0
} <<IN
        $(printf '\n%s(){ "$@" '"'\n" "$2"
          sed   -e"/$2.*{/,\$!d;s/^/    /"\
                -e"/^. *} *$/q;s/'/'"'\\&&/g'  <"$1"
          printf "\n';}")
IN

显然这不是万无一失的,但它会扫描在其第一个参数中命名的文件中查找第一组输入,该输入以第二个参数开始,在同一行的某个点上跟随 a{并拉入所有后续行,直到遇到仅匹配空格和单个}.

whilesed这样做时,它会转义输入中的所有硬引号,并将printf输入包装在两个硬引号中,并在其前面添加字符串"$@"。它将所有这些都保存在一个以第二个参数命名的函数中。这是一个例子:

printf '
some_fn(){
        echo some stuff
        cat </dev/null
}

another_fn(){
        for f in file*; do printf '\''%s\n'\'' "$f"; done
}
' >fn_file

我把这两个函数放入fn_file, 进而...

dotfn fn_file another_fn

...什么都没发生。但...

another_fn printf %s\\n

another_fn(){
    for f in file*; do printf '%s\n' "$f"; done
}

我将该函数包含在一个以自身命名的函数中,我可以使用printf或其他方式检查它,或者我可以重新定义它:

another_fn eval; another_fn

file
file1.tsv
file1.txt
file2.tsv
file2.txt
filea.xyz
fileb.xyz

我用一个简单的替换了. /dev/fd/0in并继续:dotfn()catsome_fn()

dotfn fn_file some_fn

some_fn(){ "$@" '
    some_fn(){
        echo some stuff
        cat </dev/null
    }

';}

相关内容