Saat menggunakan bash shell, saya terkadang menyimpan variabel lingkungan dalam file teks yang saya salin / rekatkan konten, misalnya exports.txt:
export FOO=bar
export FIZZ=buzz
Seseorang menunjukkan kepada saya alih-alih menyalin / menempel, saya bisa mengetik di terminal
. exports.txt
yang akan memiliki efek yang sama dengan salin / tempel.
Apa mekanisme yang digunakan perintah 'dot space filename' ini? Sulit untuk memikirkan istilah pencarian untuk itu.
Saya ingin memahami apa yang sedang terjadi dan rincian yang lebih umum tentang apa yang dilakukan one-liner ini.
help .
Ini sangat singkat sehingga mesin Stack Exchange menganggapnya terlalu pendek untuk dijadikan komentar.'. ' args
, dengan tanda kutip tunggal atau ganda. Kalau tidak, ruang tanda kutip dimakan oleh bash ketika mem-parsing baris ke token (lihat "pemisahan kata" dalam manual bash)..
aku ssource
, yang secara harfiah berarti "perintah sumber dari file ini," setidaknya bagi saya.Jawaban:
Itu
.
Perintah ("dot") adalah sinonim / pintasan untuk built-in shellsource
perintah.Itu menyebabkan skrip shell bernama untuk dibaca dan dieksekusi dalam konteks shell saat ini (bukan subkulit). Ini memungkinkan skrip bersumber untuk memodifikasi lingkungan shell panggilan, seperti mengatur variabel dan mendefinisikan fungsi shell atau alias.
sumber
source
adalah sinonim / pintas non-standar dan non-portabel untuk POSIX-defined "dot" (.
) perintah, bukan sebaliknya.source
dan yang tidak standar.
dalam mode non-POSIX, keduanya mencari direktori saat ini bahkan jika itu bukan bagian dari$PATH
. Dalam mode POSIX, ini memberikan standar.
yang tidak mencari direktori saat ini, dan tidaksource
. Dalam mode tidak adasource
identik dengan POSIX.
perintah.Sementara dua jawaban yang ada sudah sangat baik, saya merasakan contoh di mana efeknya paling "nyata" sehingga bisa dikatakan, tidak ada.
Katakanlah saya punya file
script.sh
dengan konten berikut:Jika saya menjalankan skrip ini secara normal (
sh script.sh
), Saya akan melihat ini:Tetapi jika saya di mana sumber script
. script.sh
), Saya akan berakhir dengan ini:Perhatikan bagaimana dalam kasus kedua direktori kerja shell utama kami telah berubah!
Ini karena (sebagaimana ditunjukkan dalam jawaban lain) contoh pertama berjalan dalam subkulitnya sendiri (the
sh
proses kita mulai dengansh
-perintah, ini bisa saja pada dasarnya shell,bash
,dash
, sebut saja), itu mengubah direktori di sana, tidak melakukan apa pun dan menutup. Sementara contoh kedua berjalan di shell utama kami, dan dengan demikian mengubah direktori di sana!sumber
Berikut ini sebuah contoh.
File skrip: mytest.sh
jika Anda mencoba mencetak variabel di atas, Anda tidak akan mendapatkan apa-apa
tetapi jika Anda melakukannya
atau
lalu
itu akan mencetak 1
Hanya jawaban visual dari apa yang ditulis Spiff
sumber
export
hanya jika variabel-variabel tersebut akan digunakan dalam subkulit. Saya bisa menghilangkanexport
dalam file jika variabel hanya digunakan di shell saat ini. Apakah itu benar?