GNU/Linux >> Belajar Linux >  >> Linux

Apakah ~ Selalu Sama dengan $home?

Saya tahu ini mungkin pernah ditanyakan sebelumnya, tetapi saya tidak dapat menemukannya dengan Google.

Diberikan

  • Kernel Linux
  • Tidak ada konfigurasi yang mengubah $HOME
  • bash

Akankah ~ == $HOME benarkah?

Jawaban yang Diterima:

Yang penting untuk dipahami adalah ~ ekspansi adalah fitur shell (dari beberapa shell), itu bukan karakter ajaib daripada berarti direktori home Anda di mana pun digunakan.

Itu diperluas (oleh shell, yang merupakan aplikasi yang digunakan untuk menafsirkan baris perintah), seperti $var diperluas ke nilainya dalam beberapa kondisi saat digunakan dalam baris perintah shell sebelum perintah dijalankan.

Fitur itu pertama kali muncul di cangkang C pada akhir 1970-an (cangkang Bourne tidak memilikinya, begitu pula pendahulunya cangkang Thompson), kemudian ditambahkan ke cangkang Korn (cangkang yang lebih baru dibangun di atas cangkang Bourne di 80-an). Itu akhirnya distandarisasi oleh POSIX dan sekarang tersedia di sebagian besar shell termasuk yang non-POSIX seperti fish .

Karena digunakan secara luas di shell, beberapa aplikasi non-shell juga mengenalinya sebagai direktori home. Itulah yang terjadi pada banyak aplikasi dalam file konfigurasinya atau miliknya baris perintah (mutt , slrn , vim …).

bash khusus (yang merupakan shell dari proyek GNU dan banyak digunakan di banyak sistem operasi berbasis Linux), ketika dipanggil sebagai sh , sebagian besar mengikuti aturan POSIX tentang ~ ekspansi, dan di area yang tidak ditentukan oleh POSIX, sebagian besar berperilaku seperti cangkang Korn (yang merupakan tiruan bagian).

Sementara $var diperluas di sebagian besar tempat (kecuali di dalam tanda kutip tunggal), ~ ekspansi, menjadi renungan hanya diperluas dalam beberapa kondisi tertentu.

Itu diperluas ketika pada argumennya sendiri dalam konteks daftar, dalam konteks di mana string diharapkan.

Berikut adalah beberapa contoh di mana itu diperluas di bash :

  • cmd arg ~ other arg
  • var=~
  • var=x:~:x (diperlukan oleh POSIX, digunakan untuk variabel seperti PATH , MANPATH …)
  • for i in ~
  • [[ ~ = text ]]
  • [[ text = ~ ]] (perluasan ~ diambil sebagai pola di AT&T ksh tapi bukan bash sejak 4.0).
  • case ~ in ~) ...
  • ${var#~} (meskipun tidak di beberapa shell lain)
  • cmd foo=~ (meskipun tidak ketika dipanggil sebagai sh , dan hanya jika yang ada di sebelah kiri = berbentuk seperti bash yang tidak dikutip nama variabel)
  • cmd ~/x (jelas diperlukan oleh POSIX)
  • cmd ~:x (tetapi bukan x:~:x atau x-~-x )
  • a[~]=foo; echo "${a[~]} $((a[~]))" (tidak di beberapa shell lain)

Berikut adalah beberapa contoh yang tidak diperluas:

  • echo "~" '~'
  • echo [email protected] ~~ (perhatikan juga bahwa ~u dimaksudkan untuk memperluas ke direktori home pengguna u ).
  • echo @~
  • (( HOME == ~ )) , $(( var + ~ ))
  • dengan extglob :case $var in @(~|other))... (meskipun case $var in ~|other) tidak apa-apa).
  • ./configure --prefix=~ (sebagai --prefix bukan nama variabel yang valid)
  • cmd "foo"=~ (di bash , karena tanda kutip).
  • ketika dipanggil sebagai sh :export "foo"=~ , env JAVA_HOME=~ cmd
Terkait:Debian – Misterius "tidak dapat menyelesaikan host" di dead.letter?

Seperti apa perluasannya:~ sendiri memperluas konten HOME variabel, atau bila tidak disetel, ke direktori home pengguna saat ini di database akun (sebagai ekstensi karena POSIX membiarkan perilaku itu tidak ditentukan).

Perlu dicatat bahwa di ksh88 dan bash versi sebelum 4.0, ekspansi tilde mengalami globbing (pembuatan nama file) dalam konteks daftar:

$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~

Itu seharusnya tidak menjadi masalah dalam kasus biasa.

Perhatikan bahwa karena diperluas, peringatan yang sama berlaku seperti bentuk perluasan lainnya.

cd ~

Tidak berfungsi jika $HOME dimulai dengan - atau berisi .. komponen. Jadi, meskipun sangat kecil kemungkinannya untuk membuat perbedaan, secara tegas, orang harus menulis:

cd -P -- ~

Atau bahkan:

case ~ in
  (/*) cd -P ~;;
  (*) d=~; cd -P "./$d";;
esac

(untuk menutupi nilai $HOME seperti - , +2 …) atau cukup:

cd

(sebagai cd membawa Anda ke direktori home Anda tanpa argumen apapun)

Kerang lain memiliki ~ yang lebih canggih ekspansi. Misalnya, di zsh , kami memiliki:

  • ~4 , ~- , ~-2 (dengan selesai) digunakan untuk memperluas direktori di tumpukan direktori Anda (tempat Anda cd ke sebelumnya).
  • direktori bernama dinamis . Anda dapat menentukan mekanisme Anda sendiri untuk memutuskan bagaimana ~something sedang diperluas.

Linux
  1. Mengapa [a-z] Mencocokkan Huruf Kecil Di Bash?

  2. Bagaimana Bash Tahu Bagaimana Itu Dipanggil?

  3. Apakah The Bash Star * Wildcard Selalu Menghasilkan Daftar Terurut (naik)?

  1. Bagaimana cara kerja cat << EOF di bash?

  2. Apa yang dilakukan 'bash -c'?

  3. Mengapa Ctrl + V tidak menempel di Bash (Linux shell)?

  1. Mengapa Windows 10 VM menunjukkan pemanfaatan CPU 100% selalu di QEMU-KVM?

  2. Apa yang Dilakukan 'exec {fd}/watchdog' Di Bash?

  3. Bagaimana bash menguji 'false'?