Apa arti dari sebuah titik sebelum perintah di shell?


76

Saat mengikuti tutorial debug gerhana Android, saya menemukan perintah berikut.

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

Masalah saya adalah apa arti titik sebelumnya build/envsetup.sh?

Jawaban:


80

Titik dalam konteks itu berarti "sumber" isi file itu ke shell saat ini. Dengan sourcesendirinya menjadi perintah builtin shell. Dan sourcedan operator dot menjadi sinonim.

Contoh

Katakanlah saya punya konten berikut dalam sample.shfile.

$ cat sample.sh 
echo "hi"
echo "bye?"

Sekarang ketika saya sumber:

$ . sample.sh 
hi
bye?
$

File seperti ini sering digunakan untuk memasukkan perintah pengaturan seperti menambahkan sesuatu ke variabel lingkungan tersebut.

Contohnya

Katakanlah saya punya perintah ini di file lain addvars.sh,.

$ cat addvars.sh 
export VAR1="some var1 string"
export VAR2="some var2 string"

Perhatikan bahwa saya tidak memiliki variabel apa pun di lingkungan shell saya saat ini.

$ env | grep VAR
$

Sekarang ketika saya sumber file ini:

$ . addvars.sh 
$

OK, sepertinya tidak melakukan apa-apa, tetapi ketika kami memeriksa envvariabel lagi:

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string

72

Untuk menambah jawaban slm:

Ada dua cara untuk menjalankan skrip shell. Pertama adalah menjalankan skrip dalam proses terpisah, yang berarti apa pun tentang lingkungan shell (status memori) akan kembali ke keadaan shell "parent" sebelum menjalankan proses shell "child".

Sebagai contoh, direktori kerja saat ini (lokasi di sistem file satu berada) ditentukan berdasarkan per proses. Jadi, mari kita buat skrip yang terlihat seperti ini:

#!/bin/bash
cd ~
cd ..
pwd

Jadi, sebut saja skrip ini, oh foo,. Dan mari kita jalankan skrip ini sebagai berikut:./foo

Kita akan melihat yang berikut ini:

/home

(Penafian standar bahwa ada sejumlah besar Linux dan distribusi klon UNIX lainnya di luar sana, beberapa di antaranya tidak memasukkan direktori pengguna /home. Atau, seperti yang biasa kami katakan "Jarak tempuh Anda mungkin bervariasi")

Sekarang, setelah menjalankan skrip ini, mari kita ketik perintah ini

pwd

Untuk melihat direktori tempat kita berada. Kita akan melihat sesuatu seperti ini:

/home/username

Alasannya, sekali lagi, skrip shell yang kami jalankan memiliki lingkungannya sendiri (termasuk direktorinya sendiri di mana perintah dijalankan), dan lingkungan itu hilang begitu skrip selesai berjalan.

Sekarang, mari kita jalankan fooskrip seperti ini

. ./foo

Atau, yang setara:

source ./foo

Jika kita melakukan pwdsetelahnya, kita akan melihat ini:

/home

Alasannya adalah: Sumber skrip tidak memanggil proses terpisah. Ini seperti mengetik semua perintah dalam proses induk dengan tangan; lingkungannya dilestarikan setelah skrip berakhir.


Izinkan saya memberikan contoh yang lebih sederhana. Mari kita buat skrip yang terlihat seperti ini:

#!/bin/bash
exit

Sebut saja foo. Mari kita pastikan kita bisa menjalankannya: chmod 755 foo. Lalu, mari kita jalankan seperti ini:

./foo

Tidak ada yang terjadi. Namun, di sisi lain, jika kita melakukan ini:

. ./foo

Atau ini:

source ./foo

Kami keluar.


6
Jawaban Anda lebih baik daripada yang diterima, saya mengerti bagaimana Anda menjelaskan, terima kasih!
Ahmed

Dun-da-da-duuuun! (tolong drumroll) ... dan frasa yang paling penting di sini adalah ! : Alasannya adalah: Sumber skrip tidak menyebut proses terpisah. Ini seperti mengetik semua perintah dalam proses induk dengan tangan; lingkungannya dilestarikan setelah skrip berakhir.
Gabriel Staples

Anda harus memimpin dengan contoh kedua. Itu bungkus pukulan lebih.
MonoThreaded

5

Titik (titik) adalah singkatan untuk bash bawaan source. Ini akan membaca dan menjalankan perintah dari file di lingkungan saat ini dan mengembalikan status keluar dari perintah terakhir yang dijalankan. File dapat di direktori saat ini atau di mana saja di PATH. Tidak perlu dieksekusi.


1

Cara mengetahuinya.

# type .
. is a shell builtin

# help .
.: . filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

Saya pikir ada koma yang hilang dalam manual. Seharusnya mengatakan "Jalankan perintah dari file, di shell saat ini."
ctrl-alt-delor

1

. (sumber atau operator titik)
Baca dan jalankan perintah dari argumen nama file dalam konteks shell saat ini.

Syntax
      . filename [arguments]

      source filename [arguments]

sumber adalah sinonim untuk titik / titik '.' di bash, tetapi tidak di POSIX sh, jadi untuk kompatibilitas maksimum gunakan periode.

Ketika skrip dijalankan menggunakan sumber yang dijalankan di dalam shell yang ada, variabel apa pun yang dibuat atau dimodifikasi oleh skrip akan tetap tersedia setelah skrip selesai. Sebaliknya jika skrip dijalankan seperti nama file, maka subshell terpisah (dengan seperangkat variabel yang sepenuhnya terpisah) akan muncul untuk menjalankan skrip.

Ada perbedaan tipis antara menjalankan skrip dengan menjalankan .ss64script (dot ss64script) dan. ss64script (dot space ss64script)

yang pertama menjalankan file yang disembunyikan dari perintah 'ls', (walaupun ls -a akan menampilkan file tersembunyi) opsi kedua akan mengeksekusi skrip ss64 bahkan jika belum disetel sebagai executable dengan chmod.

Sumber


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.