it-swarm-vi.com

Thực hiện một lệnh cụ thể trong một thư mục nhất định mà không cd'ing nó?

Có cách nào để thực thi một lệnh trong một thư mục khác mà không cần phải cd với nó không? Tôi biết rằng tôi có thể chỉ cần cd in và cd out, nhưng tôi chỉ quan tâm đến khả năng từ bỏ các bước bổ sung :)

43
Naftuli Kay

Tôi không biết nếu điều này được tính, nhưng bạn có thể tạo một subshell:

$ (cd /var/log && cp -- *.log ~/Desktop)

Thư mục chỉ được thay đổi cho lớp con đó, vì vậy bạn tránh được công việc cần cd - sau đó.

56
Michael Mrozek

Một số chương trình có các tùy chọn mà bạn có thể yêu cầu chúng chdir (2) mình (ví dụ GNU tar -C/--directory).

Mặc dù bên ngoài các chương trình như vậy, một cái gì đó sẽ phải chdir . Bạn có thể viết và sử dụng một số loại chương trình BST nhị phân được biên dịch thay vì để Shell thực hiện, nhưng có lẽ nó sẽ không mang lại nhiều lợi ích.

Trong một bình luận trong một câu trả lời khác, bạn đã đưa ra một ví dụ:

execindirectory -d /var/log "cp *.log ~/Desktop"

Kể từ khi *.log mẫu được mở rộng bởi chính Shell (không cp ), một cái gì đó sẽ phải chdir vào thư mục trước khi Shell đánh giá lệnh của bạn.

Nếu bạn chỉ thú vị trong việc tránh phải quay lại cd cd, thì bạn có thể sử dụng một lớp con để tách hiệu ứng của cd khỏi ví dụ Shell hoạt động của bạn .

(cd /path/to/dir && some command)

Bạn có thể gói nó trong một hàm Shell. (Tôi đã bỏ -d tùy chọn từ việc sử dụng ví dụ của bạn vì có rất ít điểm cho lệnh này nếu thư mục thực sự là tùy chọn.)

runindir() { (cd "$1" && shift && eval "[email protected]"); }

runindir /var/log 'cp *.log ~/Desktop'  # your example
runindir /var/log cp \*.log \~/Desktop  # eval takes multiple args

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first
14
Chris Johnsen

Không làm giảm giá trị của câu trả lời do người khác đưa ra, nhưng tôi tin những gì bạn muốn là đây :

(cd /path/to && ./executable [ARGS])

Lưu ý các parens để gọi cd trong Shell phụ.

11
alex

Đây là một cái gì đó sẽ cho phép bạn cd trở lại vị trí của bạn (sử dụng Bash), vì không quên làm như vậy dường như là mục đích của câu hỏi:

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(EDIT: phiên bản ngắn hơn một chút, nhờ @ Random832)

4
Bruno

Đáng buồn thay, ví dụ của bạn:

execindirectory -d /var/log "cp *.log ~/Desktop"

không cần thay đổi thư mục, bởi vì

cp /var/log/*.log ~/Desktop

sẽ làm như vậy. Bạn có thể đến gần hơn với vấn đề thực sự của bạn? Bởi vì chúng ta có thể biết một giải pháp tốt hơn cho điều đó quá.

Một cách phức tạp để giải quyết vấn đề của bạn, khác xa với sự thanh lịch của giải pháp Michaels, là sử dụng công cụ tìm, có công tắc '-execdir' được thực hiện trong thư mục, nơi tìm thấy tệp. Áp dụng không tốt cho ví dụ của bạn:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

Có lẽ nó hữu ích cho vấn đề thực sự của bạn. -okdir thay vì -execdir sẽ yêu cầu bạn xác nhận mọi lời mời.

-okdir và -execdir có thể cần cài đặt gnu-find, thường được sử dụng trên Linux.

2
user unknown

Làm thế nào về ./your/path/command.sh?

1
bdictator