Để thực thi một lệnh với một thư mục làm việc cụ thể, người ta thường làm
( cd directory && utility )
Các dấu ngoặc đơn xung quanh cd ...
có nghĩa là (các) lệnh trong đó chạy trong một khung con. Việc thay đổi thư mục làm việc trong một lớp con làm cho nó để thư mục làm việc hiện tại của vỏ gọi không bị thay đổi, tức là, sau khi đã gọi lệnh này, bạn vẫn sẽ nằm trong cùng thư mục nơi bạn bắt đầu.
Thí dụ:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
Điều này không thể được biến thành bí danh chung vì bí danh không thể lấy bất kỳ đối số nào.
Đối với một thư mục cụ thể và tiện ích, người ta có thể làm
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
nhưng đối với trường hợp chung, bạn sẽ phải sử dụng hàm shell:
cdrun () {
( cd "$1" && shift && command "$@" )
}
hoặc là
cdrun () (
cd "$1" && shift && command "$@"
)
Việc thay thế các dấu ngoặc nhọn bằng dấu ngoặc đơn quanh thân hàm làm cho hàm thực thi trong lớp con của chính nó.
Điều này sẽ được sử dụng như
$ cdrun "$HOME/somedir" ./script.sh
mà sẽ chạy tập lệnh script.sh
nằm trong thư mục $HOME/somedir
, với $HOME/somedir
tư cách là thư mục làm việc, hoặc
$ cdrun / ls -l
sẽ cung cấp cho bạn một danh sách thư mục theo "định dạng dài" của thư mục gốc.
Hàm shell lấy đối số đầu tiên của nó và cố gắng thay đổi thư mục đó. Nếu nó hoạt động, nó sẽ tắt tên thư mục khỏi các tham số vị trí (danh sách đối số dòng lệnh) và thực thi lệnh được đưa ra bởi phần còn lại của các đối số. command
là một lệnh tích hợp trong shell, nó chỉ đơn giản thực hiện các đối số của nó như là một lệnh.
Tất cả điều này là cần thiết nếu bạn muốn thực thi một lệnh với một thư mục làm việc đã thay đổi . Nếu bạn chỉ muốn thực thi một lệnh nằm ở nơi khác, rõ ràng bạn có thể sử dụng
alias thing='$HOME/somedir/script.sh'
nhưng điều này sẽ chạy script.sh
nằm ở $HOME/somedir
với hiện tại thư mục như thư mục làm việc.
Một cách khác để thực thi một tập lệnh nằm ở nơi khác mà không thay đổi thư mục làm việc là thêm vị trí của tập lệnh vào PATH
biến môi trường của bạn , ví dụ:
PATH="$PATH:$HOME/somedir"
Bây giờ script.sh
trong $HOME/somedir
sẽ có thể được chạy từ bất cứ nơi nào bằng cách chỉ sử dụng
$ script.sh
Một lần nữa, điều này không thay đổi thư mục làm việc cho lệnh.
cdrun () ( cd "$1" && shift && command "$@" )
.