gnome-terminal: làm thế nào để giữ liên kết tượng trưng của thư mục làm việc khi mở tab mới?


6

Nếu tôi đang sử dụng gnome-terminaltrong một thư mục làm việc có đường dẫn bao gồm các liên kết tượng trưng và tôi mở một tab mới, các liên kết tượng trưng sẽ được mở rộng đến các đích của chúng trong thư mục làm việc của tab mới.

Có cách nào để bảo tồn các liên kết tượng trưng khi mở một tab mới không?


Tôi không thể tái tạo hành vi mà bạn mô tả với Ubuntu 10.04 và tất cả các cài đặt mặc định cho gnome-terminal và bash. Vấn đề có thể là một thiết lập trong của bạn .bashrc; Hãy thử di chuyển nó tạm thời ra khỏi đường để kiểm tra. Nếu vấn đề vẫn còn, hãy thêm thông tin, ít nhất là các phiên bản gnome-terminalbash, và một danh sách chi tiết các bước để tái tạo hành vi này.
Gilles

1
Tôi có thể tái tạo nó. Với "thư mục bao gồm các liên kết tượng trưng", ông có nghĩa là "thư mục làm việc có đường dẫn bao gồm các liên kết tượng trưng". Trong gnome-terminal2.30.2 và bash4.1.5: mkdir -p foo/bar/baz; ln -s foo/bar/baz link; cd link- sau đó tạo tab mới - sau đó pwd. Nó sẽ báo cáo "foo / bar / baz" chứ không phải "link".
Jander

@Jander, cảm ơn, tôi sẽ chỉnh sửa để bao gồm sự làm rõ của bạn.
Ian Mackinnon

Câu trả lời:


4

Tôi nghi ngờ không có câu trả lời thực sự tốt cho việc này. gnome-terminaltìm thấy bashthư mục làm việc hiện tại bằng cách kiểm tra /proc/<pid>/cwd, có liên kết tượng trưng được mở rộng (có thể vì lý do bảo mật, nếu không có gì khác). Tôi không biết một cách khác cho một quy trình để tìm thư mục làm việc của quy trình khác.

Như một cách giải quyết, có một số thủ thuật bash bạn có thể thử, nhưng hãy xem CẢNH BÁO bên dưới! Trong .bashrc:

...
PROMPT_COMMAND='pwd >~/.bashlocal_saved_dir'
...

[ -n "$PS1" -a -f ~/.bashlocal_saved_dir ] && cd `cat ~/.bashlocal_saved_dir`
# end of .bashrc

Điều này sẽ làm hai việc. Đầu tiên, mỗi khi bash hiển thị lời nhắc, đầu tiên nó sẽ ghi thư mục làm việc hiện tại của nó vào tệp .bashlocal_saved_dirtrong thư mục chính của bạn. Thứ hai, khi bash bắt đầu tương tác (trái ngược với việc chạy tập lệnh), nó sẽ thay đổi thành thư mục được lưu trong cùng tệp đó. Điều này có nghĩa là khi bạn bắt đầu một bash tương tác mới, nó sẽ bắt đầu trong cùng một thư mục như bash hiển thị lần cuối của nó. Lưu ý rằng bạn có thể nhấn Enter để tạo bash để hiển thị lại lời nhắc của nó, do đó làm cho nó trở thành lần cuối cùng. :)

CẢNH BÁO : Đây là một bản hack và tôi chỉ thử nó đến mức tôi biết nó hoạt động. Hãy nghĩ bong bóng kẹo cao su và dây giày. Nó có thể có tác dụng đáng ngạc nhiên, và chắc chắn sẽ không hoạt động sạch như gnome-terminalcách tiếp cận. Đặc biệt, nếu bạn đang chạy nhiều tab cùng một lúc, tất cả đều thực hiện các tác vụ nền, rất có thể bạn sẽ kết thúc trong thư mục "sai" khi mở một tab mới.


1
+1. Nhưng tôi nghĩ rằng một giải pháp an toàn hơn, nếu một người chỉ có một vài thư mục hoạt động với các liên kết tượng trưng, ​​hãy kiểm tra xem bạn có đang ở trong một trong số họ không và gọi cho cdphù hợp.
ShreevatsaR

7

Lỗi này đang được theo dõi trên Ubuntu LaunchpadGnome Bugzilla .

Vì điều này chủ yếu làm phiền tôi chỉ với một vài thư mục, tôi sử dụng cách giải quyết đơn giản hơn sau đây.

Giả sử bạn có /home/username/workmột liên kết tượng trưng đến /long/path/named/asdf. Vì vậy, bạn làm cd ~/worktrong gnome-terminal, mở một tab mới và tìm thiết bị đầu cuối báo cáo đường dẫn đầy đủ. Để khắc phục điều này, chỉ cần đặt những điều sau vào .bashrc:

cd ${PWD/\/long\/path\/named\/asdf/$HOME\/work}

Khi gnome-terminal khởi động shell mới, nó sẽ nhận được thư mục hiện tại với $ PWD và nếu có /long/path/named/asdf, nó sẽ thay thế chuỗi đó bằng $HOME/workcds thành chuỗi kết quả. Nếu $ PWD không chứa chuỗi, nó tương đương với cd $PWD, không có gì.


0

Tôi yêu câu trả lời của @ ShreevatsaR . Mở rộng nó thành tín hiệu khi điều này xảy ra và để làm cho nó có thể hoàn tác nhanh chóng popd, tôi đang sử dụng:

for sub in \
    "${PWD/\/home\/vus\/.cache\/vus\/build/\/vrepos\/build}" \
    "${PWD/\/home\/vus\/repos/\/vrepos}"
do
  if [ "$sub" != "${PWD}" ] ; then
     echo -n "pushd "
     pushd "$sub"
     break # prevents first pushd from tripping later checks
  fi
done

Một ví dụ về cửa sổ mới (có PS1='#prompt# \[\033[01;34m\]\w\[\033[00;35m\]$(__git_ps1)\[\033[00m\]\$ '), bao gồm việc sử dụng các chương trình popd:

pushd /vrepos/build/2_dev_Ubuntu_Debug /home/vus/.cache/vus/build/2_dev_Ubuntu_Debug
#prompt# /vrepos/build/2_dev_Ubuntu_Debug$ popd
/home/vus/.cache/vus/build/2_dev_Ubuntu_Debug
#prompt# /home/vus/.cache/vus/build/2_dev_Ubuntu_Debug$ 

-1

Đã tìm thấy vấn đề này chưa được giải quyết kể từ gnome-shell 3.14.4.

Một cách giải quyết khác là sử dụng biến bash Shell biến thiên SHLVL (được tăng thêm 1 mỗi khi bash được bắt đầu) trong .bashrc, như sau

# bash login shell would be at level 1.
[[ $SHLVL -eq 2 ]] && cd
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.