Apa itu "$ PATH" dan "~ / bin"? Bagaimana saya bisa memiliki skrip pribadi?

29

Apa $PATH?

Bagaimana saya bisa memiliki perintah / program yang hanya tersedia untuk saya?
Saya telah melihat jalan ini ~/bindisebutkan sebelumnya, tetapi apa gunanya, dan bagaimana saya menggunakannya?

Braiam
sumber
Saya agak bereksperimen karena ini lebih banyak FAQ atau materi wiki daripada "pertanyaan nyata". Itu diminta karena saya menyebutkan ~ / bin pada jawaban sebelumnya (di bilah sisi yang ditautkan ke kanan) dan seseorang berkomentar tentang bagaimana menambahkannya ke PATH: sekarang alih-alih komentar singkat, kita dapat menautkan ke posting ini ketika ~ / bin adalah tersebut.

Jawaban:

26

$ PATH adalah variabel lingkungan yang digunakan untuk mencari perintah. ~ Adalah direktori home Anda, jadi ~ / bin akan menjadi / home / user / bin; itu adalah direktori normal.

Ketika Anda menjalankan "ls" di shell, misalnya, Anda benar-benar menjalankan program / bin / ls; lokasi yang tepat mungkin berbeda tergantung pada konfigurasi sistem Anda. Ini terjadi karena / bin ada dalam $ PATH Anda.

Untuk melihat lintasan dan menemukan di mana perintah tertentu berada:

$ echo $PATH
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:...
$ which ls     # searches $PATH for an executable named "ls"
/bin/ls
$ ls           # runs /bin/ls
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ /bin/ls      # can also run directly
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

Untuk memiliki direktori bin pribadi Anda sendiri, Anda hanya perlu menambahkannya ke path. Lakukan ini dengan mengedit ~ / .profile (file tersembunyi) untuk menyertakan baris di bawah ini. Jika baris-baris tersebut dikomentari, Anda hanya perlu menghapus komentarnya; jika mereka sudah ada di sana, Anda sudah siap!

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ]; then
  PATH="$HOME/bin:$PATH"
fi

Sekarang Anda perlu membuat direktori ~ / bin Anda dan, karena. Profil dijalankan saat login dan hanya menambahkan ~ / bin jika ada pada saat itu, Anda perlu masuk lagi untuk melihat PATH yang diperbarui.

Mari kita mengujinya:

$ ln -s $(which ls) ~/bin/my-ls   # symlink
$ which my-ls
/home/user/bin/my-ls
$ my-ls -l ~/bin/my-ls
lrwxrwxrwx 1 user user 7 2010-10-27 18:56 my-ls -> /bin/ls
$ my-ls          # lookup through $PATH
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ ~/bin/my-ls    # doesn't use $PATH to lookup
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

sumber
3
Satu hal yang harus diperhatikan ketika menggunakan yang hanya akan menemukan perintah yang merupakan binari di sistem file, itu tidak melaporkan builtin shell, alias, atau fungsi. Seringkali, ini lebih berguna untuk digunakan typeuntuk melihat bagaimana perintah aktual akan diselesaikan oleh shell; misalnya: which echodan type echoakan melaporkan hal-hal yang berbeda, whichmengembalikan '/ bin / echo' tetapi 'ketik' mengembalikan bahwa itu adalah builtin shell, yang shell lebih suka daripada file dalam '/ bin'.
Steve Beattie
@Steve Beattie, +1. whichlebih baik diganti oleh typeatau commanddi shell interaktif, dan itu benar-benar tidak berguna dalam skrip.
geirha
Satu hal yang perlu diperhatikan yang saya perhatikan - $HOMEvariabel $PATHuntuk beberapa alasan tidak berfungsi, yaitu kita harus menggunakan ~tanda.
Hi-Angel
19

Mengenai ~/bindan perintah / program hanya tersedia untuk pengguna Anda

Versi Ubuntu terbaru menyertakan ~/bindirektori di Anda $PATH, tetapi hanya jika ~/bindirektori itu ada.

Jika tidak ada:

  1. Pastikan bahwa Anda ~/.profileberisi bait berikut (standarnya ~/.profilesudah berlaku):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    
  2. Buat ~/bindirektori:

    mkdir -p ~/bin
    
  3. Mulai ulang komputer Anda, atau paksa bash untuk membaca kembali ~/.profile:

    exec -l bash
    
Danilo Piazzalunga
sumber
Terima kasih atas exec -l bashtip "reboot atau ". Apa yang dilakukan -lbendera? Saya tidak menemukan penjelasan di man exec.
evanrmurphy
3
exec -lakan mengeksekusi bash sebagai shell login [ wiki.bash-hackers.org/commands/builtin/exec] . Singkatnya, ini memaksa bash untuk membaca kembali /etc/profiledan ~/.profile. Hanya berlari exec bashhanya akan membaca ulang ~/.bashrc.
Danilo Piazzalunga