Làm cách nào để Bash có thể thực thi một lệnh trong ngữ cảnh thư mục khác?


94

Tôi có một lệnh phổ biến được gọi từ trong các thư mục rất cụ thể. Chỉ có một tệp thi hành được đặt trong / bin cho chương trình này và thư mục làm việc hiện tại rất quan trọng để chạy nó một cách chính xác. Tập lệnh ảnh hưởng đến các tệp nằm bên trong thư mục mà nó được chạy bên trong.

Bây giờ, tôi cũng có một tập lệnh shell tùy chỉnh thực hiện một số việc trong một thư mục, nhưng tôi cần gọi lệnh đó được đề cập ở trên như thể nó ở trong một thư mục khác.

Làm thế nào để bạn làm điều này trong một kịch bản shell?


Câu trả lời:


39

Bạn có thể sử dụng cdđược xây dựng trong, hay pushdpopddựng sẵn cho mục đích này. Ví dụ:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

Bạn sử dụng nội trang giống như bất kỳ lệnh nào khác và có thể thay đổi ngữ cảnh thư mục nhiều lần tùy thích trong một tập lệnh.


4
Cũng có cd -trong một trình bao POSIX để thay đổi trở lại thư mục trước đó. Điều đó nói rằng, (a) pushdpopdthực sự nhằm mục đích sử dụng tương tác và (b) không phải lúc nào cũng an toàn khi cho rằng bạn có thể cdquay lại nơi bạn bắt đầu, đặc biệt là trong các hệ thống con phức tạp có thể sử dụng các quyền hạn chế trong nội bộ (xem stackoverflow.com/questions/ 10555284 /… ).
geekosaur

3
Sử dụng một subshell là một giải pháp tốt hơn nhiều
josh123a123

Đối với kịch bản, một vỏ con có lẽ là một ý tưởng tốt hơn .. Tuy nhiên, tôi thực sự rất vui khi tìm hiểu về nó popd.
connorbode 17/02/17

Bạn có thể vui lòng giải thích :biểu tượng có nghĩa là gì ở đây?
Vadim Kotov

2
@VadimKotov Tôi nghĩ rằng đó thực sự là một việc không cần làm. Phần có liên quan của lần man bashđọc: : [arguments]Không có hiệu lực; lệnh không làm gì ngoài việc mở rộng đối số và thực hiện bất kỳ chuyển hướng nào được chỉ định. Trạng thái trả lại bằng không.
boycy

218

Sử dụng cdtrong một vỏ con; cách viết tắt để sử dụng loại vỏ con này là dấu ngoặc đơn.

(cd wherever; mycommand ...)

Điều đó nói rằng, nếu lệnh của bạn có một môi trường mà nó yêu cầu, thì nó phải thực sự đảm bảo chính môi trường đó thay vì đặt nặng lên bất kỳ thứ gì có thể muốn sử dụng nó (trừ khi đó là lệnh nội bộ được sử dụng trong các trường hợp rất cụ thể trong ngữ cảnh của giếng xác định hệ thống lớn hơn, sao cho bất kỳ người gọi nào cũng cần đảm bảo môi trường mà nó yêu cầu). Thông thường đây sẽ là một số loại trình bao bọc tập lệnh shell.


Bạn cũng có thể chèn \sau mỗi ;lệnh cho các lệnh nhiều dòng trong cùng một ngữ cảnh.
Chiramisu


20

Nếu bạn muốn quay lại thư mục làm việc hiện tại của mình:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. Chúng tôi đang đặt một biến current_dirbằng của bạnpwd
  2. sau đó chúng ta sẽ cdđến nơi bạn cần chạy lệnh của mình
  3. sau đó chúng tôi đang chạy lệnh
  4. sau đó chúng ta sẽ cdquay lại biếncurrent_dir

Giải pháp khác của @apieceofbart pushd && YOUR COMMAND && popd


4
hoặc bạn có thể làmpushd && YOUR COMMAND && pulld
apieceofbart

4
@apieceofbart Tôi nghĩ bạn muốn nói popdthay vì pulld.
Konstantin
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.