这可能永远不会是解决问题的最佳方法,但我想知道这是否可能。
就像是:
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/0
in并继续:dotfn()
cat
some_fn()
dotfn fn_file some_fn
some_fn(){ "$@" '
some_fn(){
echo some stuff
cat </dev/null
}
';}