Trình tự thoát với tiếng vang tiếng vang -e, trong các lớp vỏ khác nhau


20

Tôi chỉ nhận thấy rằng có vẻ như cờ -ekhông tồn tại cho echolệnh trong shell của tôi trên Linux. Đây chỉ là một thiết lập lộn xộn hay là "bình thường"?

Một số mã làm ví dụ:

#!/bin/sh
echo -e "\e[3;12r\e[3H"

Bản in:

-e \e[3;12r\e[3H

Điều này làm việc trước đây! Tôi đoán một số sttylệnh đã sai lầm khủng khiếp và bây giờ nó không còn hoạt động nữa. Ai đó đề nghị rằng tôi shthực sự chỉ là bash.


Không có thứ gọi là "vỏ Linux" . Ví dụ, có phần echodựng sẵn của /bin/shshell được cung cấp bởi dashgói trên Debian (một hệ điều hành có thể có Linux hoặc FreeBSD làm hạt nhân của nó).
Stéphane Chazelas

Và đây là lý do tại sao tôi chỉ đưa các nhân vật thoát vào kịch bản của mình khi tôi cần chúng.

Câu trả lời:


20

Bởi vì bạn đã sử dụng sh, không bash, sau đó echolệnh trong shkhông có tùy chọn -e. Từ shtrang web:

echo [-n] args...
            Print the arguments on the standard output, separated by spaces.
            Unless the -n option is present, a newline is output following the
            arguments.

Và nó cũng không có \e:

        If any of the following sequences of characters is encountered
        during output, the sequence is not output.  Instead, the specified
        action is performed:

        \b      A backspace character is output.

        \c      Subsequent output is suppressed.  This is normally used at
                the end of the last argument to suppress the trailing new
                line that echo would otherwise output.

        \f      Output a form feed.

        \n      Output a newline character.

        \r      Output a carriage return.

        \t      Output a (horizontal) tab character.

        \v      Output a vertical tab.

        \0digits
                Output the character whose value is given by zero to three
                octal digits.  If there are zero digits, a nul character
                is output.

        \\      Output a backslash.

        All other backslash sequences elicit undefined behaviour.

5
Một số shhỗ trợ triển khai echo -e, tại thời điểm biên dịch bashcó thể được cho là không hỗ trợ echo -e. Chỉ là sh cụ thể (có lẽ dash) không hỗ trợ -etrong khi cụ thểbash đó.
Stéphane Chazelas

17

-ekhông phải là POSIX (trên thực tế, tiếng vang POSIX thường chấp nhận không có tùy chọn nào (mặc dù được phép hỗ trợ -n), xem tại đây ) và /bin/shtrên hệ thống của bạn dường như là vỏ POSIX. -elà một tiện ích mở rộng được chấp nhận trong một số shell, nhưng bạn không nên dựa vào nó, nó không phải là di động. Lý tưởng nhất là sử dụng printfhoặc chuyển sang sử dụng vỏ có echo -e.

Cũng xem các cảnh báo \etrong các ý kiến ​​dưới đây, cần được thay thế bằng \033.

printf '\033[3;12r\033[3H'

3
như gnouc chỉ ra, shcũng không nhận ra \e. Sử dụng\033
rici

4

Lưu ý rằng bất cứ lúc nào và trong hầu hết mọi vỏ, bạn có thể tìm ra "echo" nào sẽ được gọi bằng cách gõ type echohoặc which echo. Nó thường là một vỏ dựng sẵn. Vì vậy, nó phụ thuộc vào "echo" nào được cài đặt và bạn đang sử dụng shell nào.


4
which echokhông nên được sử dụng, nó có thể sẽ không cho bạn biết nếu bạn đang sử dụng nội trang vì whichthường là nhị phân bên ngoài. typelà tốt, mặc dù.
Chris Xuống

1
Được phát hiện tốt, mặc dù trên lớp vỏ chính của tôi (zsh), đó là một nội trang (như được tiết lộ bởi type whichhoặc which which). ;)
piojo
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.