programing

셸: 다른 셸 스크립트에서 셸 스크립트를 호출하려면 어떻게 해야 합니까?

newnotes 2023. 4. 10. 22:13
반응형

셸: 다른 셸 스크립트에서 셸 스크립트를 호출하려면 어떻게 해야 합니까?

의 셸 스크립트가 .「 」a.sh ★★★★★★★★★★★★★★★★★」b.sh.

전화할 수 있나요?b.sh의 " " " 에서a.sh

여기에는 몇 가지 다른 방법이 있습니다.

  1. 다른 스크립트를 실행 가능한 상태로 만듭니다.chmod a+x /path/to/file(Nathan Lilienthal's comment), 를 추가합니다.#!/bin/bash에 있는 행이라고 불립니다)과 shebang에 $PATH환경 변수입니다.라고 할 수 .

  2. 또는 명령어를 사용하여 호출할 수도 있습니다(이 명령어의 에일리어스입니다)..는 이렇게 말합니다

    source /path/to/script
    
  3. 또는 다음과 같은 명령어를 사용하여 실행할 수 있습니다.

    /bin/bash /path/to/script
    

첫 번째 및 세 번째 접근 방식은 스크립트를 다른 프로세스로 실행하므로 다른 스크립트의 변수 및 함수에 액세스할 수 없습니다.
두 번째 접근법은 첫 번째 스크립트의 프로세스에서 스크립트를 실행하고 다른 스크립트에서 변수와 함수를 가져옵니다(따라서 호출 스크립트에서 사용할 수 있습니다).

에서는, 「」를 사용하고 있는 .exit두 번째 스크립트에서는 첫 번째 스크립트도 종료됩니다.첫 번째와 세 번째 방법에서는 일어나지 않을 것입니다.

이것 좀 봐.

#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."

여기에는 몇 가지 방법이 있습니다.스크립트를 실행할 터미널:

#!/bin/bash
SCRIPT_PATH="/path/to/script.sh"

# Here you execute your script
"$SCRIPT_PATH"

# or
. "$SCRIPT_PATH"

# or
source "$SCRIPT_PATH"

# or
bash "$SCRIPT_PATH"

# or
eval '"$SCRIPT_PATH"'

# or
OUTPUT=$("$SCRIPT_PATH")
echo $OUTPUT

# or
OUTPUT=`"$SCRIPT_PATH"`
echo $OUTPUT

# or
("$SCRIPT_PATH")

# or
(exec "$SCRIPT_PATH")

이 모든 것은 공백이 있는 경로에 대해 올바른 것입니다!!!

내가 찾던 답은:

( exec "path/to/script" )

바와 같이, 「 」exec는 새로운 프로세스를 작성하지 않고 셸을 바꿉니다., 서브셸로 정리할 수 있습니다.패런치를 사용하여 할 수 있습니다.

: 사실 ★★★★★★★★★★★★*( "path/to/script" )분합니니다다

같은 디렉토리에 다른 파일이 있는 경우는, 다음의 어느쪽인가를 실행할 수 있습니다.

bash another_script.sh

또는

source another_script.sh

또는

. another_script.sh

「 」를 사용하는 bashsource스크립트는 부모 스크립트의 환경을 변경할 수 없습니다..이며 "POSIX"는source는 ""와 "bash"의 더 쉬운 입니다...source에 걸쳐서.스크립트가 다른 곳에 있는 경우 해당 스크립트에 대한 경로를 제공하십시오.상대 경로와 전체 경로 모두 작동해야 합니다.

우우 르"... 를 로드하여 " "를 사용할 수 .source myshellfile.sh당신의 코드에 따라.§:

#!/bin/bash
set -x
echo "This is an example of run another INTO this session."
source my_lib_of_variables_and_functions.sh
echo "The function internal_function() is defined into my lib."
returned_value=internal_function()
echo $this_is_an_internal_variable

set +x

파일을 실행하고 싶을 뿐이고, 그 결과만 흥미로운 경우 다음을 수행할 수 있습니다.

#!/bin/bash
set -x
./executing_only.sh
bash i_can_execute_this_way_too.sh
bash or_this_way.sh
set +x

하시면 됩니다./bin/sh( 스크립트를 ) 실제 스크립트를 통해)

 # cat showdate.sh
 #!/bin/bash
 echo "Date is: `date`"

 # cat mainscript.sh
 #!/bin/bash
 echo "You are login as: `whoami`"
 echo "`/bin/sh ./showdate.sh`" # exact path for the script file

출력은 다음과 같습니다.

 # ./mainscript.sh
 You are login as: root
 Date is: Thu Oct 17 02:56:36 EDT 2013

먼저 호출할 파일을 포함해야 합니다.

#!/bin/bash
. includes/included_file.sh

그러면 다음과 같이 함수를 호출할 수 있습니다.

#!/bin/bash
my_called_function

간단한 소스가 도움이 됩니다.Ex의 경우

#!/bin/bash
echo "My shell_1"
source my_script1.sh
echo "Back in shell_1"

스크립트를 실행하기 위해 단말기에 입력한 내용을 줄에 추가하기만 하면 됩니다.
설명:

#!bin/bash
./myscript.sh &

실행할 스크립트가 같은 디렉토리에 없는 경우 스크립트의 전체 경로를 사용합니다.
§:'/home/user/script-directory/.myscript. sh & sh &

이것은 나에게 효과가 있었고, 이것은 다른 하나를 실행하는 메인 sh 스크립트의 내용이었다.

#!/bin/bash 
source /path/to/other.sh

은 음음음음음 the 、 음 、 상 、 을 、 안 、 the 、 the 、 the 、 the 、 the 、 the adding 。#!/bin/bash호출되는 서브스크립트의 첫 번째 줄에 연결합니다.그러나 shebang을 추가하더라도 서브셸에서 스크립트를 실행하여 출력을 캡처하는 것이 훨씬* 빠릅니다.

$(source SCRIPT_NAME)

이는 동일한 인터프리터(예를 들어 bash 스크립트에서 다른 bash 스크립트로)를 계속 실행하고 서브스크립트의 shebang 행이 실행되지 않도록 하는 경우에 작동합니다.

예를 들어 다음과 같습니다.

#!/bin/bash
SUB_SCRIPT=$(mktemp)
echo "#!/bin/bash" > $SUB_SCRIPT
echo 'echo $1' >> $SUB_SCRIPT
chmod +x $SUB_SCRIPT
if [[ $1 == "--source" ]]; then
  for X in $(seq 100); do
    MODE=$(source $SUB_SCRIPT "source on")
  done
else
  for X in $(seq 100); do
    MODE=$($SUB_SCRIPT "source off")
  done
fi
echo $MODE
rm $SUB_SCRIPT

출력:

~ ❯❯❯ time ./test.sh
source off
./test.sh  0.15s user 0.16s system 87% cpu 0.360 total

~ ❯❯❯ time ./test.sh --source
source on
./test.sh --source  0.05s user 0.06s system 95% cpu 0.114 total

* 예를 들어 바이러스 또는 보안 도구가 장치에서 실행 중인 경우 새 프로세스를 실행하는 데 100ms가 더 걸릴 수 있습니다.

pathToShell="/home/praveen/"   
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"
 #!/bin/bash

 # Here you define the absolute path of your script

 scriptPath="/home/user/pathScript/"

 # Name of your script

 scriptName="myscript.sh"

 # Here you execute your script

 $scriptPath/$scriptName

 # Result of script execution

 result=$?
chmod a+x /path/to/file-to-be-executed

실행실행 (적어도) 다른 .sh ★★★★★★★★★★★★★★★★★」./이치노

@Nathan Lilienthal의 코멘트 덕분에

새 파일이 "/home/satya/app/app_specific_env"이고 파일 내용은 다음과 같습니다.

#!bin/bash

export FAV_NUMBER="2211"

이 파일 참조를 ~/.bashrc 파일에 추가합니다.

source /home/satya/app/app_specific_env

할 는, 「」를 해 주세요.echo $FAV_NUMBER터미널에 있습니다.값이 출력됩니다.

때, , 금금당면면면면면면면면면면면면면면면면면면면면면면면면면면.source ~/.bashrc커맨드 라인에 표시됩니다.

다른 파일에서 함수를 가져오는 데 몇 가지 문제가 있습니다.
첫째: 이 파일 실행 파일을 수행할 필요가 없습니다.그렇게 하지 않는 게 좋을 거야! 그냥 추가해.

. file

모든 기능을 가져옵니다.그리고 모든 것이 파일에 정의되어 있는 것과 같습니다.
번째: 동일한 이름으로 함수를 정의할 수 있습니다.덮어쓰게 됩니다.안 좋아.그렇게 선언해도 좋다

declare -f new_function_name=old_function_name 

수입하다그래서 당신은 오래된 함수를 새로운 이름으로 부를 수 있습니다.
셋째: 파일에 정의된 함수의 전체 목록만 가져올 수 있습니다.필요하지 않은 항목이 있으면 설정을 해제할 수 있습니다.그러나 설정 해제 후 기능을 다시 작성하면 기능이 손실됩니다.그러나 위에서 설명한 대로 참조를 설정하면 동일한 이름으로 설정 해제된 후 복원할 수 있습니다.
마지막으로 일반적인 수입 절차는 위험하고 간단하지 않습니다.조심해!이 작업을 보다 쉽고 안전하게 수행하기 위해 스크립트를 작성할 수 있습니다.함수의 일부만 사용하는 경우(전부는 아님) 다른 파일로 분할하는 것이 좋습니다.불행히도 이 기술은 배쉬에서 잘 만들어지지 않았다.예를 들어 python 및 기타 스크립트 언어에서는 쉽고 안전합니다.자체 이름을 사용하여 필요한 함수만 부분적으로 가져올 수 있습니다.우리는 모두 다음 부시 버전에서 동일한 기능을 수행하기를 원합니다.하지만 이제 우리는 당신이 원하는 것을 하기 위해 많은 대구를 추가로 써야 합니다.

백틱을 사용하세요.

$ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`

그런 다음 컨슈머 스크립트의 인수로 프로듀서 스크립트의 출력을 가져옵니다.

언급URL : https://stackoverflow.com/questions/8352851/shell-how-to-call-one-shell-script-from-another-shell-script

반응형