Apa itu PATH pada Mac OS?

12

Apa yang ada PATHdi Mac OS? Saya telah menggunakannya untuk menginstal alat baris perintah global, tetapi satu-satunya dokumentasi yang saya temukan adalah tutorial untuk melakukan hal itu, tanpa penjelasan nyata tentang apa yang terjadi di bawah tenda. Saya juga belum menemukan halaman yang relevan di Wikipedia .

Jadi apa tujuan PATHdan apa perbedaan antara /etc/pathsdan ~/.bash_profile**?

Misalnya, dalam pathsfile saya , saya melihat ini:

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

Tapi di saya ~/.bash_profile, saya melihat ini:

# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

Apakah ini hanya tambahan khusus untuk pathsfile? Apa semua hal di paths, seperti /usr/bin?

gwg
sumber
2
Tolong jangan gabungkan beberapa pertanyaan dalam satu posting. Setiap pertanyaan Anda akan diterima di sini secara terpisah tetapi tidak semuanya seperti ini. Harap potong ini menjadi satu pertanyaan, Anda dapat menggabungkan 1 dan 2 tetapi yang lain tidak ada hubungannya dengan PATH secara khusus. 3 dijawab di sini. 4 dijelaskan di sini dan 5 tidak masuk akal. Pertanyaan bonus Anda, file apa yang bukan biner? Script tidak.
terdon
Saya telah mengedit pertanyaan saya. Juga, saya menemukan tautan-tautan itu bermanfaat. Terima kasih.
gwg

Jawaban:

15

1. Apa tujuan PATH?

PATHadalah variabel lingkungan yang berisi daftar direktori yang dipisahkan oleh titik dua di mana shell Anda akan mencari executable yang Anda beri nama pada baris perintah tanpa memberikan jalur eksplisit kepada mereka (seperti dalam jsdoccontoh Anda ). Jadi, jika PATHsudah

/usr/bin:/bin:/home/bin

maka setiap executable yang Anda panggil dengan nama akan dicari di direktori ini (dalam urutan itu) dan executable pertama yang ditemukan adalah yang dieksekusi.

2. Apa perbedaan antara / etc / paths dan ~ / .bash_profile

Menurut pertanyaan ini pada ServerFault , /etc/pathsdigunakan untuk mengatur PATHsecara global (yaitu seluruh sistem, untuk semua pengguna) sementara ~/.bash_profiledigunakan untuk mengatur preferensi per-pengguna (di mana ~akan menjadi direktori home pengguna). Apa yang ditulis .bash_profiledapat menambah global PATHdari /etc/pathsatau menimpanya sepenuhnya.

Sebagai catatan, /etc/pathstampaknya merupakan kekhasan MAC OS: Saya belum pernah menemukannya di GNU / Linux, setidaknya.

Joseph R.
sumber
Saya baru saja mengeditnya, tapi terima kasih telah menjawab semuanya!
gwg
@ggundersen Saya memangkas jawaban saya agar sesuai dengan pertanyaan Anda yang diedit.
Joseph R.
@ggundersen Anda mungkin juga ingin membaca jawaban saya dan tautan di dalamnya tentang /etc/pathsOSX.
terdon
7

Apa tujuan PATH?

Begitulah shell Anda menemukan program. Ketika Anda mengetik ls, misalnya, menjalankan program yang disebut lsyang hidup di /binsebagian besar sistem, termasuk Mac OS X. Shell Anda hanya dapat menemukan itu karena /binada di dalam PATH.

Shell mencari program secara PATHberurutan, dari kiri ke kanan. Jika ada dua lsprogram di sistem Anda, dan direktori mereka ada di Anda PATH, ia akan menemukan satu di direktori yang terdaftar pertama di komputer Anda PATH.

Apa perbedaan antara / etc / paths dan ~ / .bash_profile

Jalur yang ditetapkan /etc/pathsditambahkan ke PATHsaat startup di semua shell di Mac OS X.

~/.bash_profilehanyalah salah satu dari beberapa skrip shell yang dijalankan oleh Bash saat startup, dan beberapa di antaranya khusus untuk Bash. Karena itu, jika Anda mengganti shell Anda - Mac OS X juga dikirimkan tcshdan zsh, misalnya - perubahan yang dibuat /etc/bashrctidak berlaku untuk shell baru Anda.

Juga, /etc/pathsadalah file konfigurasi tingkat sistem, sementara ~/.bash_profileper pengguna. Jika Anda mengatur beberapa pengguna interaktif di Mac, Anda tidak ingin menambahkan direktori /etc/pathsyang tidak ingin Anda tampilkan di semua orang PATH. Hal yang sama berlaku untuk /etc/bashrc, kecuali tentu saja itu hanya berlaku untuk pengguna yang menggunakan Bash sebagai shell mereka.

Apa perbedaan antara PATH dan $ PATH dan $ {PATH}?

Anda biasanya hanya melihat variabel tanpa sigil ketika Anda mengatur variabel. FOO=barset FOOvariabel lingkungan ke string bar. Jika Anda mengetik set, shell menampilkan semua variabel lingkungan, dan dalam hal ini Anda juga melihat variabel tersebut tanpa sigil.

$PATHdan ${PATH}biasanya dipertukarkan. Mereka memberi tahu shell untuk memperluas nilai PATHvariabel saat ini di tempat. Perbedaannya ada hubungannya dengan bagaimana dan di mana Anda menggunakannya. Sebagai contoh:

$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx

$ echo ${FOO}x
barx

Pada echoperintah kedua , shell tidak mencetak apa-apa karena ia meminta shell untuk mencetak variabel yang dipanggil FOOx, yang tidak ada; shell memperlakukan variabel yang tidak ada sebagai kosong. Karena yang ketiga echomenggunakan sintaks kurawal, itu memungkinkan shell untuk melihat bahwa Anda meminta FOOvariabel, dan bahwa xitu hanyalah karakter lain yang ingin Anda cetak segera sesudahnya.

Ada cara lain untuk mendapatkan efek yang sama tanpa kurung kurawal:

$ echo "$FOO"x
barx

Variabel lingkungan diperluas dalam tanda kutip ganda, dan tanda kutip memisahkan xvariabel dari ekspansi variabel sehingga shell melakukan hal yang benar.

Saya menggunakan FOOvariabel lingkungan di sini hanya untuk kejelasan. Semua yang saya tulis di atas berlaku juga untuk PATH, karena itu hanya variabel lingkungan lainnya. Contoh teks akan jauh lebih lama.

Apa artinya ekspor PATH? Kapan kita mengekspor?

Mengambil FOOcontoh di atas , jika Anda menjalankan program lain, itu tidak akan melihat FOOvariabel karena tidak diekspor. Ia hanya hidup dalam satu instance shell:

$ echo $FOO
bar
$ bash
$ echo $FOO

$ exit
$ export FOO
$ bash
$ echo $FOO
bar

Ketika saya pertama kali menjalankan bashshell baru di bawah yang sudah saya gunakan, kemudian mencoba menunjukkan nilainya FOO, saya mendapatkan kosong karena FOOtidak diekspor untuk melihat sub-program. Lalu saya keluar dari bashinstance kedua , mengekspornya, berlari bashlagi, dan sekarang instance kedua melihat nilai FOO.

Anda menggunakan exportketika Anda ingin sub-program untuk melihat nilai-nilai yang ditetapkan di shell, dan tidak menggunakannya ketika Anda tidak ingin itu terjadi.

Biasanya, saya tidak mengekspor variabel sementara dalam skrip shell, karena saya tidak ingin mereka mengubah cara program berjalan dari skrip shell tersebut.

Saya tidak akan menjawab pertanyaan Anda yang lain. Anda seharusnya hanya bertanya satu per satu. Saya hanya menjawab sebanyak ini karena mereka berhubungan samar-samar. Segala sesuatu yang lain termasuk dalam pertanyaan terpisah.

Warren Young
sumber