이것은 아마도 문제를 해결하는 최선의 방법은 아니지만 가능한지 알고 싶습니다.
그것은 다음과 같습니다:
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 및 이와 유사한 경우 다음을 사용하여 <()
하위 쉘을 생성하는 것을 피할 수 있습니다 |
.
explorer.sh:
echo hallo welt
echo hello world
echo ahoj světe
소스 코드에 두 번째 줄만 넣고 싶다고 가정해 보겠습니다.
. <( sed -n '2 p' < insourcable.sh )
("Hello World" 인쇄)
답변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를 따르고 {
공백만 일치할 때까지 모든 후속 줄을 가져옵니다. 그리고 하나의 }
.
while이 sed
이를 수행하면 입력의 모든 큰 따옴표를 이스케이프하고 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
간단한 것으로 교체하고 계속했습니다.dotfn()
cat
some_fn()
dotfn fn_file some_fn
some_fn(){ "$@" '
some_fn(){
echo some stuff
cat </dev/null
}
';}