Tôi có thể sinh ra một thiết bị đầu cuối mới là bản sao của thiết bị đầu cuối hiện tại không?


8

Vì vậy, giả sử tôi đang phát triển mã trong thư mục / asdf / qwer / dfgh / wert / asdf / qwer và tôi đã thêm khoảng ba thư mục như vậy vào đường dẫn của mình và tôi có một loạt các biến môi trường phức tạp được đặt. Sau đó, tôi nhận ra rằng tôi thực sự cần một thiết bị đầu cuối khác mở và thiết lập theo cùng một cách (mặc dù nhu cầu này không được lặp lại để tôi sẽ thay đổi .bashrc của mình). Có lệnh nào để mở một cửa sổ terminal mới là bản sao chính xác của cái này không?

Câu trả lời:


10

Nhân bản đường dẫn thật dễ dàng nếu bạn có thể chạy chương trình đầu cuối của mình từ dòng lệnh. Giả sử bạn đang sử dụng xterm, chỉ cần chạyxterm & từ dấu nhắc của thiết bị đầu cuối mà bạn muốn sao chép. Xterm mới sẽ bắt đầu trong cùng thư mục, trừ khi bạn đã cấu hình nó để bắt đầu như một vỏ đăng nhập. Bất kỳ biến môi trường xuất nào cũng sẽ chuyển qua, nhưng biến không xuất sẽ không.

Một cách nhanh chóng và bẩn thỉu để sao chép toàn bộ môi trường (bao gồm cả các biến chưa xuất) như sau:

# from the old shell:
set >~/environment.tmp

# from the new shell:
. ~/environment.tmp
rm ~/environment.tmp

Nếu bạn đã đặt bất kỳ tùy chọn vỏ tùy chỉnh nào, bạn cũng sẽ phải áp dụng lại các tùy chọn đó.

Bạn có thể gói toàn bộ quá trình này thành một tập lệnh dễ chạy. Có kịch bản lưu môi trường vào một tệp đã biết, sau đó chạy xterm. Yêu cầu .bashrc kiểm tra tệp đó và lấy nguồn đó và xóa nó nếu tìm thấy.


Cách khác, nếu bạn không muốn bắt đầu một thiết bị đầu cuối từ một thiết bị đầu cuối khác hoặc chỉ muốn kiểm soát nhiều hơn, bạn có thể sử dụng một cặp hàm mà bạn xác định trong .bashrc:

putstate () {
    declare +x >~/environment.tmp
    declare -x >>~/environment.tmp
    echo cd "$PWD" >>~/environment.tmp
}

getstate () {
    . ~/environment.tmp
}

EDIT : Đã thay đổi putstateđể sao chép trạng thái "đã xuất" của các biến shell, để khớp với phương thức khác. Có những thứ khác cũng có thể được sao chép, chẳng hạn như tùy chọn shell (xem help set) - vì vậy có chỗ để cải thiện trong kịch bản này.


Wow ... lời giải thích tuyệt vời dẫn đến một số hiểu biết mà tôi đã có trước đây.
John Berryman

Tôi đã sửa đổi tập lệnh của bạn để lấy một đối số và đặt lệnh đặt và đưa môi trường vào một tệp được đặt tên theo đối số ... bây giờ tôi có thể có một số môi trường! : D
John Berryman

Câu hỏi: "." làm gì trong getstate?
John Berryman

Các "." nói, "Chạy nội dung của tệp này bằng shell hiện tại, như thể chúng được gõ vào dòng lệnh". Nếu không có ".", Một bản sao mới bashsẽ chạy các lệnh trong tệp rồi thoát và môi trường của shell hiện tại sẽ không thay đổi.
Jander

0

Nếu bạn khởi động screen(Màn hình GNU) trong môi trường đã xác định của mình, môi trường đó sẽ được sử dụng bởi quy trình phụ (nghĩa là screen) và bạn có thể sử dụng nó để sinh ra các thiết bị đầu cuối mới. Nhưng nếu bạn muốn rẽ nhánh vào một lần khác (a screenin a screen) thì nó bắt đầu khó khăn.


0

Trong một tình huống tương tự, tôi cũng thấy hữu ích khi bắt đầu shell mới trong cùng thư mục với cái hiện tại. Tôi đã sử dụng một công thức như thế này để bắt đầu vỏ.

exec ssh -t $HOST "cd $DIR; $SHELL $parms"

Tùy chọn -t là cần thiết bất cứ khi nào bạn chạy shell một cách rõ ràng bằng ssh. Nó gây ra một giả giả được tạo ra cho quá trình. Điều này là cần thiết để các lệnh lịch sử và các tính năng tương tác khác hoạt động chính xác. Các dòng trước đó trong tập lệnh đặt DIR vào thư mục hiện tại và SHELL cho trình bao ưa thích của người dùng.


0

trong khi các biến được xuất làm cho phía bên kia sử dụng hàm 'getstate' ở trên, vì một số lý do, cuối cùng chúng không được xuất ở đó (có thể thấy bằng cách sử dụng os.getenv đơn giản từ python). nó dường như hoạt động tốt hơn đối với tôi khi sửa đổi getstate thành bí danh:

alias getstate=". ~/environment.tmp"
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.