Tôi có thể làm cho tất cả các lệnh có phản hồi nếu chúng đã hoạt động hoặc không hoạt động?


11

Đôi khi khi tôi chạy các lệnh, nó không hiển thị đầu ra, vì vậy tôi không chắc chúng có hoạt động hay không. Có thể làm cho tất cả các lệnh có phản hồi nếu chúng chạy đúng hay không? Hoặc ở mức tối thiểu để hiển thị id phản hồi họ đã chạy (chính xác hoặc không)


6
Ý tưởng chung là: không có phản hồi có nghĩa là nó hoạt động.
Rinzwind

1
Điều này là không đúng sự thật. Ví dụ, cryptsetuptheo mặc định có thể bỏ qua một số thông báo lỗi. Đó là một điều tốt để có $?trong bạn PS1. Bước tiếp theo là thêm thời gian hiện tại, để luôn biết thời gian của các lệnh;)
d33tah

Câu trả lời:


11

(Tôi nghĩ vì bạn đang đăng bài bên trong Hỏi Ubuntu, chúng tôi có thể giả sử bạn đang nói về shell mặc định, đó là Bash .)

Có một câu trả lời rất hay trong câu hỏi Stack Overflow Trong tập lệnh shell: lệnh echo shell khi chúng được thực thi (đây không chỉ là một giải pháp dành riêng cho Ubuntu).

Những gì bạn cần làm là sử dụng lệnh set để bật verbose hoặc xtrace.

set -o

sẽ cung cấp cho bạn một danh sách trong đó các thông số hiện tại được chuyển sang trên hoặc tắt .

set -v

hoặc phiên bản dài:

set -o verbose

sẽ bật verbose ON .

Tôi nghĩ rằng những gì bạn muốn, mặc dù, thực sự là xtrace. Điều này sẽ không chỉ lặp lại mỗi lệnh bạn chạy, nó cũng sẽ mở rộng các tham số và cung cấp cho bạn nhiều phản hồi hơn. Vì vậy, nếu tôi làm điều gì đó ngớ ngẩn như gõ 'hi' ở thiết bị đầu cuối, tôi sẽ nhận được tiếng vang về những gì tôi đã nhập cũng như báo cáo / dấu vết về việc shell đã làm gì để thực hiện lệnh 'hi' (xem ảnh chụp màn hình bên dưới ):

Nhập mô tả hình ảnh ở đây

Để bật xtrace:

set -x

hoặc là:

set -o xtrace

Để vô hiệu hóa các tham số này, bạn (ngược lại bằng trực giác) gọi các lệnh tương tự ngoại trừ bằng ký hiệu dấu cộng + thay vì ký hiệu dấu gạch ngang hoặc dấu trừ, ví dụ:

set +v

sẽ tắt verbose , tương tự:

set +x

sẽ tắt xtrace .


Hướng dẫn chi tiết về các tùy chọn shell nằm trong Chương 33. Tùy chọn, Bash nâng cao - Hướng dẫn về kịch bản .


1
Nhưng làm thế nào để nó hoạt động khi lệnh là chính xác? nó có cho đầu ra nào không? nói cho lệnh whoami >/dev/null.
Người dùng đã đăng ký

Vâng, tất nhiên là có, nó lặp lại những gì bạn đã nhập cộng với bất kỳ tham số bổ sung nào liên quan đến lệnh được gọi âm thầm khi gọi lệnh của bạn. Nếu bạn muốn nói, nó có in "THÀNH CÔNG" không, thì thật đáng buồn, không, câu trả lời của Avinash Raj sẽ làm điều đó.
Benjamin R

@PeterMortensen cảm ơn vì những chỉnh sửa tinh tế trong câu trả lời của tôi.
Benjamin R

13

Để kiểm tra xem một số lệnh có hoạt động thành công hay không, bạn có thể kiểm tra trạng thái trả về , được đưa ra bởi $?, của lệnh trước đó bằng:

echo $?

Trạng thái trả về 0có nghĩa là lệnh đã hoàn thành thành công, trong khi đầu ra khác không ( mã lỗi ) có nghĩa là một số vấn đề đã gặp phải hoặc có lỗi và có thể biết danh mục từ mã lỗi. Mã lỗi Linux / C được định nghĩa trong /usr/include/asm-generic/errno-base.h/usr/include/asm-generic/errno.h.

Cũng trong bash, .bashrcđịnh nghĩa một bí danh alertcó thể được sử dụng để thông báo với trạng thái hoàn thành. Bạn sẽ phải đính kèm bí danh với lệnh hoặc lệnh kết hợp như thế này:

some_command --some-switch; alert

Bạn có thể nối dòng mã sau vào ~/.bashrctệp của mình để hiển thị trạng thái trả về của lệnh cuối cùng được thực thi ..

# show the return code of last command executed
PS1='${debian_chroot:+($debian_chroot)}\u@\h(lst ret. $(echo $?) ):\w\$ '

(mở tệp ~/.bashrcbằng trình soạn thảo văn bản bạn chọn và sao chép dòng trên, dán tệp vào tệp và lưu. Khởi chạy phiên bản mới của thiết bị đầu cuối và bạn nên có nó trong hành động. Hoặc thay vào đó bạn có thể xác định một số chức năng và sử dụng nó PS1giống như được minh họa dưới đây.)

một bản demo nhỏ:

hash@precise(lst ret. 0 ):~$ ls -sh someFileThatsNotThere
ls: cannot access someFileThatsNotThere: No such file or directory
hash@precise(lst ret. 2 ):~$ 
hash@precise(lst ret. 2 ):~$ aCommandThatsNot
aCommandThatsNot: command not found
hash@precise(lst ret. 127 ):~$ 
hash@precise(lst ret. 127 ):~$ echo "you should get a lst ret. 0, I believe the system has echo installed :)"
you should get a lst ret. 0, I believe the system has echo installed :)
hash@precise(lst ret. 0 ):~$
hash@precise(lst ret. 0 ):~$ sudo touch /tmp/someTestFile
[sudo] password for hash: 
hash@precise(lst ret. 1 ):~$
hash@precise(lst ret. 1 ):~$ chown $USER:$USER /tmp/someTestFile 
chown: changing ownership of `/tmp/someTestFile': Operation not permitted

Chỉ chơi với PS1:) ..một chút nữa,

function showRetStat {
## line1: initiliazing retStat with the return status of the previous command
retStat=$?
## line2: Left padding the return status with spaces. If you prefer the unpadded one, you can just replace
# $retStatFtd in the lines initializing noErrStr and errStr among other possible ways.
retStatFtd=$(sed -e :a -e 's/^.\{1,2\}$/ &/;ta' <<< $retStat)
## lines3&4: Setting the strings to display for a successful and unsuccessful run of previous command
# which we are going to display with the prompt string. Change the strings to display text of your
# choice like you may set noErrStr="yippie!" , errStr="oopsie!" in place of what they're now.
noErrStr="retStat "$retStatFtd" :: PASS ^_^"
errStr="retStat "$retStatFtd" :: FAIL x_x"
## line5: Applying the logic and display the proper string at the prompt. Space padded number i.e. retStatFtd, here,
# worked in the logic, originally I intended to use this for the display while retStat in the conditional
# check; you could make the function one statement less if you want to.
echo "$([ $retStatFtd = 0 ] && echo "$noErrStr" || echo "$errStr")"
}

## Combining the function showRetStat into the prompt string.
PS1='${debian_chroot:+($debian_chroot)}\u@\h($(showRetStat)):\w\$ '

(bạn có thể sửa đổi chức năng để làm cho nó lạ mắt hơn, giống như @gronostaj làm trong bài đăng của anh ấy.)


2
Tôi thực sự thích câu trả lời mở rộng của bạn với các ví dụ. Tôi khá chắc chắn rằng OP muốn xtrace nhưng cá nhân tôi sẽ thấy điều này hữu ích cho việc gỡ lỗi các chương trình dòng lệnh của riêng tôi cũng như hiểu rõ hơn về người khác.
Benjamin R

1
Tôi sẽ đề nghị đệm trái giá trị trả về, để nó luôn có cùng độ dài.
o0 '.

+1 để sửa đổi PS1. Đây là cái tôi sử dụng, với số màu đỏ trong trường hợp có lỗi, không có gì thêm nếu lệnh cuối cùng thành công:\[\033[01;41;37m\]${?#0}\[\033[00;01;36m\] \u@\h:\w\[\033[00m\]\$
Carlos Campderrós

1
@rusty là không cần ~/.bashrcfile nguồn ?
Avinash Raj

2
Có, sửa đổi PS1 là hữu ích và rất linh hoạt. Tôi hiển thị một hạnh phúc ^_^trên thành công, và một màu đỏ x_xtrên bất cứ điều gì khác.
Izkata

5

Bạn có thể thay đổi dấu nhắc lệnh của mình để hiển thị dấu tick màu xanh lá cây khi lệnh trước đó thoát bằng 0 và màu đỏ X khác. Arch Linux Wiki có một số đoạn mã hay để thêm vào bash.rc:

set_prompt () {
    Last_Command=$? # Must come first!
    Blue='\[\e[01;34m\]'
    White='\[\e[01;37m\]'
    Red='\[\e[01;31m\]'
    Green='\[\e[01;32m\]'
    Reset='\[\e[00m\]'
    FancyX='\342\234\227'
    Checkmark='\342\234\223'

    # Add a bright white exit status for the last command
    #PS1="$White\$? "
    # If it was successful, print a green check mark. Otherwise, print
    # a red X.
    if [[ $Last_Command == 0 ]]; then
        PS1+="$Green$Checkmark "
    else
        PS1+="$Red$FancyX "
    fi
    # If root, just print the host in red. Otherwise, print the current user
    # and host in green.
    if [[ $EUID == 0 ]]; then
        PS1+="$Red\\h "
    else
        PS1+="$Green\\u@\\h "
    fi
    # Print the working directory and prompt marker in blue, and reset
    # the text color to the default.
    PS1+="$Blue\\w \\\$$Reset "
}
PROMPT_COMMAND='set_prompt'

(Tôi đã tắt mã lỗi thực tế vì tôi không thích nó, nếu bạn muốn xem mã chính xác chỉ cần xóa #khỏi dòng này #PS1="$White\$? ":)

Đây là vẻ ngoài của nó:

Ảnh chụp màn hình GUI Terminal

ảnh chụp màn hình


2

, có thể nhận phản hồi cho mọi lệnh bạn đã thực hiện trên thiết bị đầu cuối. Nó hoạt động trên cơ sở echo $?trả về 0 để hoàn thành thành công lệnh và bất kỳ giá trị nào khác ngoài 0 cho thất bại.

Để có được phản hồi thành công hay thất bại, hãy thêm dòng dưới đây vào ~/.bashrctệp.

bind 'RETURN: ";if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;\n"' 

Và sau đó ~/.bashrctập tin nguồn để làm cho nó hoạt động.

source ~/.bashrc

Giải trình:

Đối với mỗi lệnh bạn đã thực hiện trên thiết bị đầu cuối, ;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;mã này sẽ tự động được liên kết với nó.

Thí dụ:

$ sudo apt-cache policy firefox;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
firefox:
  Installed: 24.0+build1-0ubuntu1
  Candidate: 24.0+build1-0ubuntu1
  Version table:
 *** 24.0+build1-0ubuntu1 0
        500 http://ubuntu.inode.at/ubuntu/ saucy/main amd64 Packages
        100 /var/lib/dpkg/status
SUCCESS

$ suda apt-get update;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
No command 'suda' found, did you mean:
 Command 'sudo' from package 'sudo-ldap' (universe)
 Command 'sudo' from package 'sudo' (main)
 suda: command not found
FAILURE

nhập mô tả hình ảnh ở đây


1
bind 'RETURN: " && echo SUCCESS || echo FAILED \n"'cũng sẽ làm như vậy, bạn không cần phải kiểm tra [[ $? == 0 ]]rõ ràng.
souravc

Tuy nhiên, tiêu chuẩn C / Linux và tiêu chuẩn ngữ pháp tiếng Anh đối với 'Thành công' sẽ là KHÔNG CÓ.
Benjamin R
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.