Bagaimana memanggil shell script dari yang lain shell script?

Saya memiliki dua shell script, a.sh dan b.sh.

Bagaimana saya bisa memanggil b.sh dari dalam shell script a.sh?

Mengomentari pertanyaan (5)

Ada beberapa cara yang berbeda yang dapat anda lakukan ini:

  1. Membuat script executable, tambahkan #!/bin/bash garis di bagian atas, dan path dimana file tersebut ke $PATH variabel lingkungan. Kemudian anda dapat menyebutnya sebagai normal perintah;

  2. Atau sebut saja dengan sumber perintah (alias .) seperti ini: sumber /path/to/script;

  3. Atau menggunakan bash perintah untuk mengeksekusi itu: /bin/bash /path/to/script;

Yang pertama dan ketiga metode execute script sebagai proses lain, sehingga variabel dan fungsi-fungsi dalam script lain tidak akan dapat diakses. Kedua metode mengeksekusi script di script pertama's proses, dan menarik dalam variabel dan fungsi dari script lain sehingga mereka dapat digunakan dari pemanggilan script.

Dalam metode kedua, jika anda menggunakan keluar dalam kedua naskah itu, akan keluar pertama script juga. Yang tidak akan terjadi di pertama dan ketiga metode.

Komentar (12)

Check this out.

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

Ada beberapa cara yang dapat anda lakukan ini. Terminal untuk mengeksekusi 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")

Semua ini adalah benar untuk jalan dengan spasi!!!

Komentar (3)

Jawaban yang saya cari:

( exec "path/to/script" )

Seperti disebutkan, exec menggantikan shell tanpa menciptakan sebuah proses baru. Namun, kita dapat memasukkannya ke dalam subkulit, yang dilakukan dengan menggunakan parantheses.

EDIT: Benar-benar ( "path/to/script" ) adalah cukup.

Komentar (6)

Tergantung pada. Sebentar... Jika anda ingin memuat variabel pada saat ini konsol dan mengeksekusi anda dapat menggunakan sumber myshellfile.sh pada kode anda. Contoh:

!#/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

Jika anda hanya ingin menjalankan file dan satu-satunya hal yang menarik bagi anda adalah hasilnya, dapat anda lakukan:

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

Saya harap membantu anda. Terima kasih.

Komentar (1)

Anda dapat menggunakan /bin/sh untuk memanggil atau menjalankan script yang lain (via anda yang sebenarnya script):

 # 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

Output akan sama:

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

Tambahkan saja di garis apa pun yang anda akan telah mengetik di terminal untuk mengeksekusi script!
misalnya:

#!bin/bash
./myscript.sh &

jika skrip dijalankan tidak dalam direktori yang sama, hanya menggunakan path lengkap dari script.
misalnya:`/home/user/script-directory/./myscript.sh &

Komentar (2)

Pertama, anda harus menyertakan file yang anda hubungi:

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

kemudian anda memanggil fungsi seperti ini:

#!/bin/bash
my_called_function
Komentar (0)

Sumber yang sederhana akan membantu anda. Untuk Ex.

#!/bin/bash
echo "My shell_1"
source my_script1.sh
echo "Back in shell_1"
Komentar (0)

Atas jawabannya menyarankan menambahkan #!/bin/bash baris ke baris pertama dari sub-script yang dipanggil. Tetapi bahkan jika anda menambahkan peristiwa, itu jauh lebih cepat* untuk menjalankan script di sub-shell dan menangkap output:

$(sumber SCRIPT_NAME)

Ini bekerja ketika anda ingin tetap menjalankan interpreter (misalnya dari bash lain bash script) dan memastikan bahwa peristiwa garis sub-script tidak dieksekusi.

Misalnya:

#!/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

Output:

~ ❯❯❯ 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

* misalnya ketika virus atau alat-alat keamanan yang berjalan pada perangkat mungkin memerlukan tambahan 100ms untuk menjalankan proses baru.

Komentar (0)
 #!/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=$?
Komentar (1)
pathToShell="/home/praveen/"   
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"
Komentar (0)

Asumsikan file baru "/home/satya/aplikasi/app_specific_env" dan isi file sebagai berikut

#!bin/bash

export FAV_NUMBER="2211"

Tambahkan file ini referensi ke ~/.file bashrc

source /home/satya/app/app_specific_env

Ketika anda me-restart mesin atau login kembali, mencoba echo $FAV_NUMBER di terminal. Itu akan output nilai.

Hanya dalam kasus jika anda ingin melihat efek segera, source ~/.bashrc pada command line.

Komentar (0)
chmod a+x /path/to/file-to-be-executed

Itu adalah satu-satunya hal yang saya butuhkan. Setelah script yang akan dieksekusi dilakukan eksekusi seperti ini, anda (setidaknya dalam kasus saya) don't perlu tambahan lain operasi seperti sh, atau ./ saat anda memanggil script.

Terima kasih untuk komentar dari @Nathan Lilienthal

Komentar (0)

Gunakan backticks.

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

Kemudian mengambil output dari produsen script sebagai argumen pada konsumen script.

Komentar (0)

Ada beberapa masalah untuk fungsi impor dari file lain. Pertama: Anda perlu't untuk melakukan hal ini file yang dapat dieksekusi. Lebih baik untuk tidak melakukannya! hanya menambahkan

. file

untuk mengimpor semua fungsi. Dan semua dari mereka akan jika mereka didefinisikan dalam file anda. Detik: Anda dapat mendefinisikan fungsi dengan nama yang sama. Itu akan ditimpa. It's buruk. Anda dapat menyatakan seperti itu

declare -f new_function_name=old_function_name 

dan hanya setelah itu melakukan impor. Jadi anda dapat menghubungi tua fungsi dengan nama baru. Ketiga: Anda dapat mengimpor daftar lengkap dari fungsi-fungsi yang didefinisikan dalam file. Jika tidak diperlukan, anda dapat menonaktifkan mereka. Tapi jika anda menulis ulang fungsi unset mereka akan hilang. Tetapi jika anda mengatur referensi untuk itu seperti yang dijelaskan di atas, anda dapat mengembalikan setelah diset dengan nama yang sama. Akhirnya kesamaan prosedur impor berbahaya dan tidak begitu sederhana. Hati-hati! Anda dapat menulis script untuk melakukan hal ini lebih mudah dan aman. Jika anda hanya menggunakan bagian dari fungsi(tidak semua) yang lebih baik membagi mereka dalam file yang berbeda. Sayangnya teknik ini tidak dilakukan dengan baik di bash. Di python misalnya, dan beberapa bahasa script itu's mudah dan aman. Mungkin untuk membuat sebagian impor hanya fungsi-fungsi yang diperlukan dengan nama sendiri. Kita semua ingin bahwa dalam berikutnya bush versi yang akan melakukan fungsi yang sama. Tapi sekarang Kita harus menulis banyak tambahan cod untuk melakukan apa yang anda inginkan.

Komentar (1)

Jika anda memiliki file lain di direktori yang sama, anda dapat melakukan:

bash another_script.sh

atau

sumber another_script.sh

atau

. another_script.sh

Ketika anda menggunakan bash bukan dari sumber, script tidak bisa mengubah lingkungan dari orang tua script. The . perintah standar POSIX sementara sumber perintah lebih mudah dibaca bash sinonim untuk . (Saya lebih suka sumber atas .). Jika naskah anda berada di tempat lain hanya memberikan jalan untuk itu naskah ini. Kedua relatif serta penuh jalan harus dunia.

Komentar (0)