스크립트 간에 변수를 전달하는 방법은 무엇입니까?
예: 두 개의 테스트 스크립트가 있습니다.
-- test2.sh
#!/bin/bash
echo "this is test2.sh"
echo "varname is $varname"
echo end
-- tes1.sh
#!/bin/bash
varname="123456"
ssh [email protected]
"bash" < varname=$varname test2.sh
아이디어는 test1.sh
원격 서버에 연결하고 실행하기 위해 실행한다는 것입니다 test2.sh
. 그러나 내가 얻는 것은 .varName is 123456: No such file or directory
답변1
왜 매개변수로 전달하지 않나요? 즉.
test2.sh
#!/bin/bash
echo "this is test2.sh"
echo "varName is $1"
echo end
test1.sh
#!/bin/bash
varName="123456"
scp test2.sh [email protected]:/tmp/
ssh [email protected] "/tmp/test2.sh $varName"
ssh [email protected] "rm -f /tmp/test2.sh"
답변2
"작업 순서" 유형의 문제가 있는 것 같습니다. <
명령을 실행하기 전에 처리하여 비슷한 것을 실행하고 있습니다(정확히 동일하지는 않지만).
varname=$varname test2.sh | ssh [email protected] bash
로컬로 실행 test2.sh
된 다음 해당 출력을 bash
원격 서버로 보냅니다. 그렇기 때문에 출력이 표시되지만 test2.sh
해당 출력을 명령으로 실행하려고 하면 오류가 발생합니다.
실행 가능한 스크립트를 실행하는 경우 실제로는 필요하지 않으므로 bash
다음을 수행할 수 있습니다.
ssh [email protected] "varname=$varname ./test2.sh"
test2.sh
원격 서버에서 사용할 수 있다고 가정합니다 .
원격 서버가 없고 test2.sh
여전히 그곳에서 실행하려는 경우 다음을 수행할 수 있습니다.
ssh [email protected] varname="$varname" bash < test2.sh
bash
이렇게 하면 스크립트 소스가 리디렉션되지만 실행 파일의 컨텍스트에서 변수 처리가 수행됩니다.
답변3
명령줄에서 프로세스 환경을 정의하려면 정의를 정렬해야 합니다.앞으로주문하다:
varname=$varname bash < $varname test1.sh
실제로 다음과 같은 파일을 열고 싶어할 것 같지 않습니다.
varname=${expansion_of_varname}
이것이 당신이하려는 일인 것 같지만. 이로 인해 문제도 발생할 것으로 예상됩니다. 네가 원한다면모든변수 할당은 모든 쉘 하위 환경에 영향을 미치므로 다음을 수행할 수 있습니다.
set -a
...첫번째.( x=; <${x:=file} sh -c 'echo "$x"'
그래도 중간 세미콜론 없이는 작동하지 않는 것 같습니다.).