Đầu ra của lệnh nào được sử dụng để nhập vào cd


7

Tôi muốn lấy đầu ra của lệnh which và cd vào thư mục cha. Ví dụ: giả sử tôi có những điều sau đây:

which someprogram

Với đầu ra:

/home/me/somedirectory/someprogram

Và tôi muốn cd vào thư mục mà someprogram sống trong:

cd /home/me/somedirectory

Tôi muốn thực hiện điều này trong một dòng. Cách thanh lịch, khó khăn, ngắn nhất để làm điều này là gì?

Câu trả lời:


13

Sử dụng dirname:

cd "`dirname $(which program)`"

8
+1 nhưng sử dụng $()thay vì backticks:cd $(dirname $(which program))
glenn jackman

1
@glennjackman Nó hoạt động tốt với một cặp backticks (như thể hiện trong câu trả lời, hoặc ngược lại với $ () ở bên ngoài và backticks ở bên trong). Nó chỉ không hoạt động với một cặp backticks bên trong được lồng bên trong một cặp backticks bên ngoài riêng biệt.
Eliah Kagan

3
@EliahKagan Tôi nghĩ rằng quan điểm của @ glennjackman không phải là backticks không hoạt động, mà là chúng sẽ dần bị loại bỏ $()nhiều ưu điểm của $()backticks.
jw013

5

Trong bash, tôi khuyên bạn nên type -phơn which. whichlà một lệnh bên ngoài và đôi khi nó khó khăn . Bạn có thể sử dụng sedđể xóa mọi thứ sau trận chung kết /hoặc sử dụng dirnametiện ích cho mục đích đặc biệt .

cd "$(dirname -- "$(type -p program)")"
cd "$(type -p program | sed 's:[^/]*$::')"

Trên dòng lệnh, nếu bạn biết rằng thư mục không chứa bất kỳ ký tự đặc biệt nào (khoảng trắng hoặc \[?*), bạn có thể bỏ qua dấu ngoặc kép. Bạn cũng có thể sử dụng backquote thay vì một trong những $(…)(backquote lồng nhau là khó khăn, không có giá trị ở đây).

cd `dirname $(type -p program)`
cd $(dirname `type -p program`)
cd `type -p program | sed 's:[^/]*$::'`

Trong zsh, có một cú pháp nhỏ gọn hơn.

cd ${$(whence -p program):h}
cd ${$(echo =program):h}
cd ${${_+=program}:h}

(Vâng, cái cuối cùng là mật mã. Nó sử dụng ${VAR+TEXT}cú pháp trên _biến, với giá trị =programtương đương với $(whence -p program).)

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.