Apa tujuan dari cd `(backtick)?

56

Yang berikut berperilaku sama di Fedora dan CentOS.

cd mydirectory

bekerja.

cd notadirectory

berfungsi (mendapat kesalahan dari Bash).

Namun,

cd `

memberi saya semacam prompt:

>

Tidak ada yang saya pikir untuk masuk memberikan tanggapan, itu hanya menuju ke baris berikutnya untuk meminta lagi. Saya cukup menggunakan CTRL+ Cuntuk keluar kembali ke root@localhost.

Apa tujuan dari ini dan apa yang bisa dilakukan dengan itu?

Terima kasih!

Mooseman
sumber
6
Jadi pertanyaan Anda lebih tentang >soal backtick, karena itu juga bisa terjadi dalam situasi lain
Tobias Kienzler

Jawaban:

123

Apa yang Anda ketikkan adalah backtick - ini adalah awal instruksi untuk bash untuk mengevaluasi apa yang Anda ketikkan sebagai perintah. The >ditampilkan untuk menunjukkan Anda masih memasukkan perintah pada baris berikutnya.

Jika Anda menutup backtick Anda akan menemukan seluruh perintah akan berjalan. Misalnya

~$ cd `
> echo /var`
/var$
John C
sumber
17
Anda bahkan dapat membuat sarang mereka. Untuk contoh yang agak realistis: cd `dirname \`which ls\``= cd ke direktori tempat biner "ls" berada. (Yaitu cd /binsejak itu /bin/ls) [sunting: Fiuh, melarikan diri bahwa penurunan harga adalah KERAS]
MSalters
54
@MSalters Kau mungkin tersandung pada alasan mengapa pesta yang modern lebih suka $()untuk ``. Contoh Anda (ditambah kutipan yang benar) akan menjadi cd "$(dirname "$(which ls)")"jauh lebih tidak waras.
Muzer
31
@Muzer Bukan hanya bash yang lebih suka, tetapi direkomendasikan dalam spesifikasi POSIX untuk menggunakan $()lebih dari backquotes.
Starfish
59

Jawaban JohnC sudah menjelaskan backtick. Tapi apa yang Anda juga ingin tahu adalah >prompt. Ini kelanjutan prompt, dan itu tidak hanya dipicu oleh backtick, tetapi selalu ketika shell Anda dengan jelas tahu Anda belum selesai memasukkan perintah. Contoh termudah adalah menempatkan kelanjutan garis eksplisit \di akhir baris input (yang membantu memisahkan input panjang):

$ echo \
> hallo

Perhatikan bahwa sama seperti PS1mengontrol tampilan command prompt, Anda juga dapat mengatur PS2untuk mengubah prompt lanjutan, misalnya

$ export PS2="(cont.) "
$ echo \
(cont.) hallo

Ada banyak alasan untuk kelanjutan ini terjadi. Backtick tunggal tidak lengkap, tetapi Anda juga bisa memasukkan sesuatu seperti

ls -l `which cp`

dalam satu baris (catatan samping: Disarankan untuk digunakan $(dan )sebagai gantinya, karena tanda kurung memperjelas di mana ekspansi dimulai dan berakhir, sementara backtick tunggal membuatnya lebih sulit untuk melihat di mana seseorang hilang. Dan bersarang ...). Kemungkinan alasan lain untuk permintaan lanjutan:

  • hilang donesetelah whileataufor
  • hilang fisetelahif
  • hilang esacsetelahcase
  • tanda kurung tutup yang hilang, misalnya dalam subkulit (cd $HOME; cat .bashrc)
  • perintah yang hilang setelah pemipaan |serta eksekusi kondisional ||dan &&(tidak &, karena itu hanya membuat perintah berjalan di latar belakang)
  • kutipan penutupan yang hilang ( 'atau ")

Anehnya, tanda kurung yang hilang }setelah ekspansi variabel ${juga menyebabkan prompt kelanjutan, tetapi akan gagal karena ruang yang dimasukkan:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution
Tobias Kienzler
sumber
2
Dan hal yang sama terjadi ketika menggunakan tanda kutip :)
Steen Schütt
1
Saya sudah tahu jawaban untuk pertanyaan ini ketika saya melihatnya di bilah sisi, tetapi saya ingin memberi Anda +1 ekstra, meskipun, imajiner +1 untuk jawaban mendalam yang sangat bagus. Ini adalah jenis konten yang membuat situs StackExchange mengagumkan. Jadi ... Terima kasih dan tetap luar biasa.
Unkwntech
4

Ini berarti bahwa perintah Anda belum selesai. Bahkan, karakter backtick,, `digunakan untuk membatasi perintah inline.

Contoh:

cd /tmp # Go to /tmp
pwd # Prints the current working  directory
ls `pwd` # Lists the content of the current working directory
Slyx
sumber
0

Backtick memulai / mengakhiri substitusi perintah. Shell membaca perintah di dalam backticks, menginterpretasikan hasilnya, dan menempatkan hasilnya ke dalam perintah. Misalnya:. ls which cpmenghasilkan "yang cp" dieksekusi dan hasil dari perintah itu, yaitu, / bin / cp akan digunakan sebagai argumen ke perintah ls. Perilaku ini, bagaimanapun, sudah usang, mendukung substitusi perintah $ (cmd) yang lebih eksplisit dan mudah dibaca.

Saat mengetik cd `Shell mengharapkan perintah untuk dieksekusi untuk mengikuti, dan, harus ditutup dengan backtick.

Dalam kasus ekspansi variabel menggunakan kawat gigi shell menyajikan prompt lanjutan karena kawat gigi tersebut dievaluasi secara leksikal sebelum ekspansi dilakukan.

Nicole Stevens
sumber