gọi zsh, để nó chạy lệnh và sau đó vào chế độ tương tác thay vì thoát


32

tôi muốn bắt đầu zsh tương tự như

zsh -c 'my_prog option1 option2'

nhưng thay vì thoát ra sau khi chạy lệnh đó, hãy để tôi ở propt của zsh được gọi (không phải bất cứ nơi nào nó được gọi từ đó). một trường hợp sử dụng cụ thể cho trường hợp này là trong các tệp screenrc, bạn có thể làm một cái gì đó như:

screen -t my_prog 0 zsh -c 'my_prog opt1 opt2'

và sau khi chạy lệnh đó, bạn để lại một cái vỏ ở đó thay vì nó đóng lại.

Câu trả lời:


24

Không phải là tôi sẽ khuyên làm điều này.

(sirius)~: zsh -c 'print hello; zsh -i'
hello
(sirius)~: echo $SHLVL
2

Có những thủ thuật khác bạn có thể chơi với màn hình và sử dụng $STYbiến.

Nếu bạn muốn một cái gì đó chạy từ zsh với các màn hình riêng lẻ, bạn có thể kiểm tra biến $ STY trong .zshrc hoặc .zlogin của bạn. Nó ở định dạng <PID>.<TTY>.<HOSTNAME>.

if [[ -n $STY ]] then
  if [[ -f ~/.zsh-$STY[(ws:.:)2] ]] then
    . ~/.zsh-$STY[(ws:.:)2]
  fi
fi

Nếu trong màn hình và nếu ~/.zsh-<TTY>(từ biến $ STY) tồn tại, hãy tìm nguồn đó, sau đó tiếp tục theo cách vui vẻ của bạn. Bạn cũng có thể đặt biến môi trường trước khi gọi shell tương tác.

> FOO=bar zsh -i
> env | grep FOO
FOO=bar

> RUNTHISCOMMAND=/path/to/script zsh -i
.zshrc:
if [[ -n $RUNTHISCOMMAND ]] then
   $RUNTHISCOMMAND
fi

Thêm các kiểm tra vào .zshrc / .zlogin của bạn.


giáo sư đã dạy tôi về SHLVL
Nicolas Dumazet

tôi đã hy vọng tránh được cái vỏ lồng nhau, nhưng ồ.
Autoplectic

14

Tôi tìm thấy một giải pháp hoạt động mà không cần thêm vỏ ở đây . Thêm vào:

if [[ $1 == eval ]]
then
    "$@"
set --
fi

đến .zshrc, sau đó gọi zsh với

zsh -is eval 'your shell command here'

Thực sự tuyệt vời để bắt đầu nhiều vỏ cùng một lúc.


6

Còn việc gắn ; exec zshvào lệnh thì sao? Bằng cách đó, chỉ còn lại một cái vỏ ở cuối.


5
Bạn thực sự không cần người thực thi nếu bạn ; zsh -i, nó đã làm điều đó cho bạn rồi.
Hội trường Darren

4

Tôi có eval "$RUN"ở cuối của tôi .zshrc. Bây giờ tôi có thể chạy các lệnh mà không cần trình bao thêm, với:

RUN='my_prog opt1 opt2' zsh

Đây có vẻ là một loại bùn kỳ lạ - nhưng nó hoạt động rất tốt!
zaTricky
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.