Saya memiliki dua shell script, a.sh
dan b.sh
.
Bagaimana saya bisa memanggil b.sh
dari dalam shell script a.sh
?
Ada beberapa cara yang berbeda yang dapat anda lakukan ini:
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;
Atau sebut saja dengan sumber
perintah (alias .
) seperti ini: sumber /path/to/script
;
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.
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!!!
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.
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.
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
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 &
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.
#!/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=$?
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.
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
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.
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.