Mục đích của cd `(backtick) là gì?


56

Sau đây hành xử tương tự trong Fedora và CentOS.

cd mydirectory

làm.

cd notadirectory

hoạt động (bị lỗi từ Bash).

Tuy nhiên,

cd `

cung cấp cho tôi một số loại dấu nhắc:

>

Không có gì tôi nghĩ để nhập cung cấp bất kỳ phản hồi, nó chỉ đơn giản là đi đến dòng tiếp theo để nhắc lại. Tôi chỉ đơn giản là sử dụng CTRL+ Cđể thoát trở lại của tôi root@localhost.

Mục đích của việc này là gì và người ta có thể làm gì với nó?

Cảm ơn!



6
Vì vậy, câu hỏi của bạn là về >nhiều hơn là về backtick, vì điều đó cũng có thể xảy ra trong các tình huống khác
Tobias Kienzler

Câu trả lời:


123

Những gì bạn đã gõ là một backtick - đó là khởi đầu của một hướng dẫn bash để đánh giá những gì bạn gõ như một lệnh. Nó >được hiển thị để cho biết bạn vẫn đang nhập lệnh trên dòng tiếp theo.

Nếu bạn đóng backtick, bạn sẽ thấy toàn bộ lệnh sẽ chạy. Ví dụ

~$ cd `
> echo /var`
/var$

17
Bạn thậm chí có thể lồng chúng. Đối với một ví dụ hơi thực tế: cd `dirname \`which ls\``= cd vào thư mục chứa tệp nhị phân "ls". (tức là cd /binvì nó /bin/ls) [sửa: phew, thoát khỏi sự đánh dấu đó là CỨNG]
MSalters

54
@MSalters Bạn đã có lẽ stumbled khi lý do tại sao bash hiện đại thích $()đến ``. Ví dụ của bạn (cộng với trích dẫn chính xác) sẽ trở nên cd "$(dirname "$(which ls)")"ít điên rồ hơn nhiều.
Muzer

31
@Muzer Không chỉ là bash thích nó, mà nó còn được khuyến nghị trong đặc tả POSIX để sử dụng $()cho các backquote.
Sao biển

59

Câu trả lời của JohnC đã giải thích cho backtick. Nhưng những gì bạn cũng đang tự hỏi là >nhắc nhở. Đây là một dấu nhắc tiếp tục và nó không chỉ được kích hoạt bởi một backtick, mà luôn luôn khi trình bao của bạn biết rõ bạn chưa hoàn thành việc nhập lệnh. Ví dụ đơn giản nhất là đặt tiếp tục dòng rõ ràng \ở cuối dòng đầu vào (giúp phân tách đầu vào dài):

$ echo \
> hallo

Lưu ý rằng giống như PS1điều khiển giao diện của dấu nhắc lệnh, bạn cũng có thể đặt PS2để thay đổi lời nhắc tiếp tục, ví dụ:

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

Có nhiều lý do cho việc tiếp tục xảy ra. Một backtick không đầy đủ, nhưng bạn cũng có thể nhập một cái gì đó như

ls -l `which cp`

trong một dòng duy nhất (lưu ý phụ: Nên sử dụng $()thay vào đó, vì các dấu ngoặc đơn làm cho việc mở rộng bắt đầu và kết thúc rõ ràng, trong khi các backticks đơn làm cho việc nhìn thấy nơi bị thiếu trở nên khó khăn hơn. Và lồng nhau ...). Các lý do có thể khác cho lời nhắc tiếp tục:

  • mất tích donesau whilehoặcfor
  • mất tích fisau mộtif
  • mất tích esacsaucase
  • một dấu ngoặc đơn đóng thiếu, ví dụ trong các ô con (cd $HOME; cat .bashrc)
  • một lệnh bị thiếu sau khi đường ống |cũng như thực thi có điều kiện ||&&( &mặc dù vậy, vì điều đó chỉ làm cho lệnh chạy ở chế độ nền)
  • một trích dẫn kết thúc bị thiếu ( 'hoặc ")

Thật kỳ lạ, một dấu ngoặc bị thiếu }sau khi mở rộng biến ${cũng gây ra dấu nhắc tiếp tục, nhưng sẽ thất bại do không gian được chèn:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution

2
Và điều tương tự xảy ra khi sử dụng dấu ngoặc kép :)
Steen Schütt

1
Tôi đã biết câu trả lời cho câu hỏi này khi tôi nhìn thấy nó trong thanh bên nhưng tôi muốn cung cấp cho bạn thêm +1, mặc dù, +1 tưởng tượng cho một câu trả lời sâu sắc rất hay. Đây là loại nội dung làm cho các trang web StackExchange trở nên tuyệt vời. Vì vậy, ... Cảm ơn và tiếp tục tuyệt vời.
Unkwntech

4

Nó có nghĩa là lệnh của bạn chưa hoàn thành. Trong thực tế, ký tự backtick `, được sử dụng để phân định một lệnh nội tuyến.

Thí dụ:

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

0

Backtick bắt đầu / kết thúc thay thế lệnh. Shell đọc lệnh bên trong backticks, diễn giải kết quả và đặt các kết quả đó vào lệnh. Ví dụ:. ls which cpdẫn đến "cp nào" được thực thi và kết quả của lệnh đó, tức là / bin / cp sẽ được sử dụng làm đối số cho lệnh ls. Tuy nhiên, hành vi này không được chấp nhận, thay vào đó là sự thay thế lệnh $ (cmd) rõ ràng và dễ đọc hơn.

Khi gõ cd `Shell đang mong đợi một lệnh sẽ được thực thi để tuân theo và đóng lại bằng một backtick.

Trong trường hợp mở rộng biến bằng cách sử dụng dấu ngoặc, trình bày dấu nhắc tiếp tục bởi vì các dấu ngoặc đó được đánh giá từ vựng trước khi mở rộng được thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.