Chạy lại lệnh trước theo sudo


8

Tôi muốn có thể chạy một lệnh, nó không thành công vì nó không có quyền thích hợp. Sau đó tôi có thể viết "làm ơn" để sudo lệnh tôi vừa chạy.

Đây là những gì tôi muốn làm trong thiết bị đầu cuối:

$ run command
"you don't have access to do that"
$ please
"ran successfully"

Tôi thấy rằng nó !!sẽ lấy lệnh trước đó, vì vậy tôi nghĩ rằng tôi có thể sử dụng lệnh đó, nhưng tôi không thể làm cho nó hoạt động.

kịch bản shell xin vui lòng của tôi trông như thế này, nhưng tôi không thể làm cho bất kỳ cái nào trong số này hoạt động. Nó chỉ nói "lệnh không tìm thấy !!" và in ra cách sử dụng sudo.

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)

Nó hoạt động mà không có kịch bản? Nếu bạn chỉ chạy sudo !!, nó có chạy như mong đợi không? Tôi nghĩ !! có thể chỉ là bí danh bash, vì vậy nó có thể không hoạt động trong zsh
Chris Wayne

3
AFAIK, mở rộng lịch sử ( !!và những thứ khác) chỉ hoạt động trong các vỏ tương tác chứ không phải trong các tập lệnh.
Thor

sudo !!trong chế độ tương tác gần như hoạt động như mong đợi. Khi tôi nhấn enter, nó sẽ thay thế !!bằng lệnh trước đó. sau đó tôi phải nhấn enter lần nữa để chạy nó.
jb.

Câu trả lời:


6

Bạn không thể sử dụng !!trong tập lệnh shell, vì bạn không thể truy cập shell cha trong trình bao con. Mặc dù tôi khuyên bạn nên sử dụng sudo !!, nhưng nếu bạn thực sự muốn tạo tập lệnh BASH, bạn sẽ phải sử dụng .bash_history, như vậy:

#!/bin/bash
sudo `cat $HOME/.bash_history | tail -n1`

Nó chắc chắn KHÔNG phải là một giải pháp hoàn hảo, nhưng nó nên thực hiện các mẹo. Nếu bạn đang sử dụng ZSH, điều này sẽ không hoạt động, vì ZSH không xuất ra .bash_history (theo hiểu biết của tôi). CẬP NHẬT : Đây là phiên bản nên hoạt động với ZSH:

#!/usr/bin/zsh
. $HOME/.zshrc
sudo `cat \`readlink -f $HISTFILE\` | tail -n1`

Hi vọng điêu nay co ich!

Nếu bạn không hiểu tập lệnh, nó chỉ đơn giản chạy lệnh cuối cùng được nhập trong BASH với sudo.


đồng ý. Tôi đang sử dụng zsh mặc dù. Có bất kỳ tương đương cho .bash_history trong zsh không?
jb.

Bây giờ tôi nhìn, vâng, có một phiên bản nên hoạt động. Tôi chưa thử nó mặc dù.
MiJyn

Đừng đọc tệp lịch sử bash trực tiếp. Sử dụng fchoặc tích historyhợp. Theo mặc định, $ HISTFILE không được cập nhật cho đến khi bạn đăng xuất khỏi bash.
Steven K

24

Thêm vào .zshrc của bạn:

alias please='sudo $(fc -ln -1)'

Làm việc một điều trị, có vẻ tốt hơn câu trả lời được chấp nhận ở trên để dễ sử dụng.
Mitchell Currie

2
Đối với người tò mò: fclà viết tắt của lệnh fix. Các tài liệu ở đây .
dshepherd

Cảm ơn bạn! Tôi biết đây là AskUbfox, nhưng tôi đã sử dụng nó trên OSX để sao chép lệnh cuối cùng của tôi vào bảng tạm hệ thống: alias lastcmd="fc -ln -1 | pbcopy"Tôi tin rằng điều này sẽ (?) Hoạt động trên Ubuntu : alias lastcmd="fc -ln -1 | xclip -selection clipboard.
HellaMad
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.