2009-04-20 24 views

Trả lời

15

Lưu vào thư mục làm việc cuối cùng trong bash_logout ~ ./ vào một tập tin ẩn:.

pwd > ~/.lastdirectory 

đọc tập tin này trong ~/.bashrc với

[ -s ~/.lastdirectory ] && cd `cat ~/.lastdirectory` 
+1

Không cần thử nghiệm nếu bạn báo giá mở rộng của mình đúng cách. – lhunath

+0

Nếu đó là ~/.bash_logout (số giữa ~ và /) thay vì ~ ./. Bash_logout? – Gnubie

1

Bạn có thể ghi thư mục hiện tại (pwd) vào một số tệp mỗi khi thay đổi dir (cd). Khi bắt đầu thiết bị đầu cuối, tập lệnh khởi động bash sẽ xem tệp đó cho "dir cuối cùng". Nếu một cái gì đó tìm thấy - cd với nó.

0

Nhìn vào .bashrc và có lẽ là có thể sửa đổi nó lúc logout để chứa các thư mục mà bạn quan tâm.

0

Bạn rất có thể muốn lưu các thư mục hiện hành vào một tập tin khi thoát vỏ. Có một số cách để phát hiện các exitting shell:

  1. Đặt một số mã trong ~/bash_logout. Điều này sẽ chỉ được thực hiện khi một trình bao đăng nhập thoát, vì vậy nếu bạn chỉ cần đóng một cửa sổ đầu cuối, thư mục sẽ không được lưu.
  2. Bẫy trên EXIT. Sử dụng nội trang "bẫy", bạn có thể có một số mã được thực thi khi trình bao thoát. Điều này sẽ chạy khi thoát khỏi bất kỳ trình bao nào - tốt, bất kỳ trình bao nào trong đó bạn thiết lập bẫy, tức là.

Bạn có thể lưu CWD vào mọi lời nhắc hoặc mỗi khi bạn chạy 'cd', nhưng đó là một chút quá mức cần thiết.

Để khôi phục CWD của bạn khi vỏ tiếp theo bắt đầu là một vấn đề đơn giản khi chạy 'cd' trên nội dung của tệp lưu nếu nó tồn tại.

Bạn có thể muốn suy nghĩ về điều gì sẽ xảy ra nếu bạn có nhiều hệ vỏ đang chạy cùng một lúc. Bạn muốn lưu CWD của ai? Nên tất cả các shell mới bắt đầu sử dụng CWD đó? Hay chỉ là vỏ tiếp theo bắt đầu?

6

Đặt này trong ~/.bashrc của bạn (có thể là ở cuối):

cd "$(<~/.storepwd)" 

Sau đó, bạn có thể chọn một trong các tùy chọn sau:

Hoặc đặt này trong ~/.bash_logout (sẽ không nhớ thư mục cho vỏ không đăng nhập tương tác):

printf %s "$PWD" > ~/.storepwd 

Hoặc sử dụng một trap trên EXIT, đặt này trong thư mục ~/.bashrc (bẫy có thể được ghi đè một cách dễ dàng/vô tình) :

trap 'printf %s "$PWD" > ~/.storepwd' EXIT 

Hoặc sử dụng PROMPT_COMMAND, đặt này ~/.bashrc (có lẽ là cách đáng tin cậy nhất) của bạn:

PROMPT_COMMAND+='; printf %s "$PWD" > ~/.storepwd' 

Cũng đảm bảo rằng ~/.profile hoặc ~/.bash_profile nguồn của bạn ~/.bashrc, nếu không, đường dẫn sẽ không được khôi phục khi bắt đầu quá trình đăng nhập.

Xem http://mywiki.wooledge.org/DotFiles để biết thông tin về cách bạn nên sử dụng dấu chấm của mình.

+0

+1 Điều này cụ thể hơn nhiều so với câu trả lời được chấp nhận. –

2

Bạn cũng cần phải cẩn thận với toàn bộ khái niệm này. Ví dụ: nếu bạn quản lý để mã của bạn chạy khi bạn không mong đợi, nó có thể gây nhầm lẫn bất kỳ số lượng thứ. Ví dụ, nếu bạn chạy một kịch bản lệnh shell đã thay đổi thư mục làm việc hiện tại, và sau đó, trong khi thoát, quản lý để lưu CWD của nó, bạn có thể kết thúc, trong shell tiếp theo khởi động, trong một thư mục bạn không mong đợi.

Một số phổ biến khác, ít nhất là cho tôi ở $ làm việc, là khi một tập lệnh được chạy khi người chủ gốc chạy tập lệnh, tất cả sẽ tự động (tức là theo chương trình). Nếu bạn đang thực hiện thủ thuật CWD này cho người dùng của riêng bạn, điều đó là tốt, nhưng nó có thể làm hỏng các công cụ hệ thống mà mong đợi rằng "su - youruser -c ls" trả về các tệp trong thư mục chính của bạn. (Ok, gọi "ls" là người dùng của bạn là một ý tưởng ngớ ngẩn, nhưng có những thứ mà người dùng của bạn có thể có một môi trường tốt hơn để chạy một cái gì đó hơn root - ví dụ, trên NFS gắn kết có gốc đè bẹp.)

Vì vậy , chìa khóa ở đây là để biết bạn có đang ở trong một trình tương tác hay không và nếu không, sẽ không khôi phục hoặc lưu CWD của bạn. IIRC, $ - có một 'i' cho các trình bao tương tác. Sử dụng nó để đặt bẫy và khôi phục lại CWD.

Cá nhân, tôi chỉ cần thiết lập một bí danh:

alias go='. go.sh' 

và sau đó go.sh chỉ đơn giản là kiểm tra thông số của nó mà thư mục Tôi muốn đi đến. ví dụ: "go myproj" sẽ cd ~/svn/myproj và "go bigdisk" sẽ cd/mnt/bigdisk. Và, đối với các trường hợp phức tạp hơn, nó có thể mất nhiều tham số hơn, ví dụ: "go myproj lib" sẽ chỉ "cd ~/svn/myproj/myproj/lib" hoặc bất kỳ thứ gì. Không tiết kiệm tự động, nhưng cũng không có tác dụng phụ nào.

Các vấn đề liên quan