Có tiện ích POSIX (hoặc ít nhất là phổ biến) để đặt thư mục làm việc hiện tại khi gọi chương trình không?


20

Chúng tôi có env (1) để sửa đổi môi trường của lệnh chúng tôi muốn chạy (ví dụ env MANPAGER=more man dtrace). Có một cái gì đó tương tự nhưng để sửa đổi thư mục mà lệnh sẽ được bắt đầu trong?

Lý tưởng nhất, tôi muốn nó trông như thế này:

theMagicCommand /new/cwd myProgram

Bằng cách này, nó có thể được "xâu chuỗi" với các lệnh giống như env (1) khác, vd

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

Cho đến nay tôi có thể nghĩ ra giải pháp sau, thật không may, không có giao diện giống như env (1):

cd /new/cwd && myProgram

Ngoài ra, tôi chỉ có thể tạo một tập lệnh shell đơn giản như thế này:

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"

nhưng tôi đang tìm kiếm thứ gì đó đã tồn tại (ít nhất là trên macOS và FreeBSD).

myProgramkhông nhất thiết phải là một ứng dụng máy tính để bàn (trong trường hợp đó tôi chỉ có thể sử dụng phím Path trong tệp .desktop ).


6
Tại sao cd /new/cwd && env VAR=value myProgramkhông đáp ứng phê bình của bạn?
jpaugh

Điều đó đã có trong câu hỏi, nơi M. Piotrowski giải thích rằng đó không phải là giao diện giống như env. Nhìn vào env. So sánh nó với rtprio, idprio, numactl, jexec, chrt, và thực sự là các lệnh trong bộ công cụ được đề cập trong câu trả lời. Có một mô hình, và nó đang tải chuỗi.
JdeBP

3
Bạn có ý nghĩa gì với giao diện của Wap? Và tại sao không sử dụng (cd the/cwd; cmd)?
Konrad Rudolph

2
@KonradRudolph Chẳng hạn, bạn không thể dễ dàng chuyển (cd the/cwd; cmd)sang env (1) mà không gói nó bằng sh (1).
Mateusz Piotrowski

Câu trả lời:


19

AFAIK, không có tiện ích chuyên dụng nào như vậy trong rương công cụ POSIX. Nhưng điều phổ biến là gọi shđể thiết lập một môi trường (cwd, giới hạn, thiết bị xuất chuẩn / in / err, umask ...) trước khi chạy một lệnh như bạn làm trong shtập lệnh của mình .

Nhưng bạn không phải viết tập lệnh đó trong một tập tin, bạn chỉ có thể nội tuyến tập lệnh đó:

sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args

(giả sử thư mục là không -). Thêm CDPATH=(trong trường hợp có một trong môi trường) và -Pđể nó hoạt động giống như một đường thẳng chdir().

Ngoài ra, bạn có thể sử dụng perlchdir()không thẳng chdir()ra khỏi hộp.

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args

Ồ, vâng. Đây là một biến thể rất tiện dụng của tập lệnh mà tôi đưa vào câu hỏi của mình. Tôi sợ rằng tiện ích tôi đang tìm kiếm không tồn tại vì chức năng của nó đã có sẵn với một oneliner sh (1) tương đối ngắn.
Mateusz Piotrowski

8
Nếu bạn đang chạy sh, bạn cũng có thể làm (cd /wherever && exec /my/command). Việc ()ngầm mở một lớp con để chạy các lệnh được bao bọc, và tất nhiên, execthoát khỏi quá trình shell bổ sung ngay khi /my/commandbắt đầu chạy.
jpaugh

2
Điều đó đã được đề xuất trong một câu trả lời hiện đã bị xóa. Người hỏi giải thích rằng đó không phải là câu trả lời cho những gì xe hỏi.
JdeBP

15

Các bộ công cụ được sử dụng trong thế giới daemontools, và các nơi khác, có cái này và hơn thế nữa; đã có nhiều năm; và có sẵn rộng rãi.

Tất cả đều là các công cụ tải chuỗi, được thiết kế để sử dụng chính xác trong các loại chuỗi này. Có rất nhiều công cụ tải chuỗi trong các bộ công cụ này cho các mục đích khác.

đọc thêm


11

Có một chương trình phổ biến như vậy. Nó được gọi là ... giữ vào ghế của bạn ... Đánh trống ... env. Phiên bản GNU, kể từ phiên bản 8.28, không phải POSIX, có -Ctùy chọn cho phép bạn đặt thư mục theo yêu cầu:

    TÊN
           env - chạy chương trình trong môi trường đã sửa đổi

    TÓM TẮC
           env [TÙY CHỌN] ... [-] [NAME = GIÁ TRỊ] ... [LỰA CHỌN [ARG] ...]

    SỰ MIÊU TẢ
           Đặt từng TÊN thành GIÁ TRỊ trong môi trường và chạy LỰA CHỌN.

           Đối số bắt buộc đối với các tùy chọn dài cũng là bắt buộc đối với các tùy chọn ngắn.

           -i , - môi trường bên ngoài
                  bắt đầu với một môi trường trống rỗng

           -0 , - hoàn toàn
                  kết thúc mỗi dòng đầu ra bằng NUL, không phải dòng mới

           -u , --unset = TÊN
                  loại bỏ biến khỏi môi trường

           -C , --chdir = DIR
                   thay đổi thư mục làm việc thành DIR

           --hỗ trợ hiển thị trợ giúp này và thoát

           --phiên bản
                  thông tin phiên bản đầu ra và thoát

           Chỉ - ngụ ý -i . Nếu không có LỆNH, hãy in môi trường kết quả.


Thật tuyệt, mặc dù nó không có sẵn trên macOS và FreeBSD.
Mateusz Piotrowski

1

Một số chương trình có một tùy chọn cho việc này, như Git:

-C <path>

Chạy như thể gitđã được bắt đầu <path>thay vì thư mục làm việc hiện tại.

và làm:

-C dir, --directory=dir

Thay đổi thư mục dirtrước khi đọc tệp thực hiện hoặc làm bất cứ điều gì khác.

và Tar:

-C, --directory=DIR

Thay đổi thành DIRtrước khi thực hiện bất kỳ hoạt động. Tùy chọn này là nhạy cảm với thứ tự, tức là nó ảnh hưởng đến tất cả các tùy chọn theo sau.


Vâng. Mặc dù câu hỏi của tôi là nếu myProgramkhông cung cấp tùy chọn như vậy ... Cảm ơn bạn đã đóng góp nhưng tôi sợ nó không trả lời câu hỏi của tôi.
Mateusz Piotrowski
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.