Đầ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ỏ $()vì 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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.