Tôi muốn chạy một kịch bản để thay đổi thư mục làm việc hiện tại:
#!/bin/bash
cd web/www/project
Nhưng, sau khi tôi chạy nó, pwd hiện tại vẫn không thay đổi! Làm thế nào tôi có thể làm điều đó?
Tôi muốn chạy một kịch bản để thay đổi thư mục làm việc hiện tại:
#!/bin/bash
cd web/www/project
Nhưng, sau khi tôi chạy nó, pwd hiện tại vẫn không thay đổi! Làm thế nào tôi có thể làm điều đó?
Câu trả lời:
Đó là một hành vi dự kiến, và đã được thảo luận nhiều lần.
Kịch bản lệnh được chạy trong một lớp con và không thể thay đổi thư mục làm việc của lớp vỏ cha. Hiệu ứng của nó bị mất khi kết thúc.
Để thay đổi thư mục vĩnh viễn, bạn nên tìm nguồn script, như trong
. ./script
source ./script
giống nhau không
.
và source
bằng nhau trong bash. 2. chúng ta không cần sử dụng ./
trước tên tệp nếu nó nằm trong cùng thư mục. Chỉ có thể chạy cái này thôi:. script
Đối với các tác vụ nhỏ như thế này, thay vì tạo tập lệnh, hãy tạo một bí danh như thế này,
$ alias cdproj='cd /dir/web/www/proj'
Bạn nên thêm nó vào .bashrc
tập tin của bạn , nếu bạn muốn nó được đặt cho mọi shell tương tác.
Bây giờ bạn có thể chạy này như $ cdproj
.
eval `./script`
hoặc eval $(./script)
để thực thi các lệnh đó. Đây là một cách tiếp cận phổ biến cho các lệnh cần cập nhật môi trường của shell shell.
eval
tiếp cận.
exec bash
ở cuốiMột tập lệnh bash hoạt động trên môi trường hiện tại của nó hoặc trên môi trường con cái của nó, nhưng không bao giờ trên môi trường cha mẹ của nó.
Tuy nhiên, câu hỏi này thường được hỏi vì người ta muốn để lại dấu nhắc bash trong một thư mục nhất định sau khi thực thi tập lệnh bash từ thư mục khác.
Nếu đây là trường hợp, chỉ cần thực hiện một cá thể bash con ở cuối tập lệnh:
#!/usr/bin/env bash
cd desired/directory
exec bash
Điều này tạo ra một subshell mới. Nhập exit
để trở về shell đầu tiên nơi kịch bản ban đầu được bắt đầu.
exec
thường được coi là biện pháp cuối cùng của một kẻ vô lại .. :)
exit
(hoặc Ctrl + D), bạn sẽ phải làm điều đó từ 11 đến 21 lần. (2) Một nhược điểm khác của việc sử dụng tập lệnh thực thi là, nếu bạn đặt bất kỳ tùy chọn shell nào (ví dụ: dotglob
hoặc globstar
) trong phiên shell tương tác của mình, bạn sẽ mất chúng, bởi vì bạn đang bắt đầu một shell mới.
Mặc dù có những câu trả lời thực hiện hành động chính xác mà bạn muốn, một phương pháp chuẩn hơn cho mục đích đó là tạo liên kết tượng trưng:
ln -s ~/web/www/project proj #use full path to dir!
Sau đó, bạn có thể cd
vào thư mục bằng cách sử dụng tên proj
:
cd proj
Phương pháp này linh hoạt hơn vì bạn có thể truy cập các tệp bằng tên ngắn mà không cần cd
:
ls proj/ #note the endslash!
vim proj/file.x
Nếu bạn thay đổi giữa các thư mục ở xa trong hệ thống tập tin. Tôi sẽ đề nghị autojump .
Phụ thuộc vào những gì bạn sẽ làm, một giải pháp khác có thể là tạo một hàm thay vì một tập lệnh.
Thí dụ:
Tạo một hàm trong một tệp, giả sử /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
Sau đó đưa nó vào bashrc
hoặc zshrc
tập tin của bạn :
# Somewhere in rc file
source /home/aidin/my-cd-script
Bây giờ bạn có thể sử dụng nó như một lệnh:
$ my-cd
Tại sao không sử dụng "exec" nó đường nối để làm chính xác những gì tôi muốn.
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(hoặc Ctrl + D), bạn sẽ phải làm điều đó từ 11 đến 21 lần.
dotglob
hoặc globstar
), bạn sẽ mất chúng, bởi vì bạn đang bắt đầu một shell mới. Tiết (Cont'd)
Bạn có thể làm điều đó bằng cách sử dụng một hàm hoặc sử dụng && Các ví dụ dưới đây cài đặt Zabbix và tạo một tệp có một dòng bên trong nó.
Ví dụ:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
hoặc là:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
để thoát khỏi tập lệnh có nguồn gốc theo cách này, chứ không phảiexit
- chúng giống như các hàm shell vàexit
sẽ thoát khỏi trình bao lấy tập lệnh.