หลีกเลี่ยงลำดับด้วย "echo -e" ในกระสุนที่แตกต่างกัน


20

ฉันเพิ่งสังเกตเห็นว่าดูเหมือนว่าแฟล็ก-eไม่มีอยู่สำหรับechoคำสั่งในเชลล์ของฉันบน Linux นี่เป็นเพียงการตั้งค่าที่สับสนหรือเป็น "ปกติ" หรือไม่

ตัวอย่างรหัสบางส่วน:

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

พิมพ์:

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

ก่อนหน้านี้ทำงานได้! ฉันเดาว่าsttyคำสั่งบางอย่างผิดพลาดไปอย่างมากและตอนนี้มันไม่ทำงานอีกต่อไป ใครบางคนบอกว่าฉันเป็นจริงเพียงshbash


ไม่มีสิ่งดังกล่าวเป็นเป็น"เปลือก Linux" มีตัวอย่างในตัวของเปลือกตามที่บัญญัติไว้โดยแพคเกจใน Debian (ระบบปฏิบัติการที่สามารถมี Linux หรือ FreeBSD เป็นเคอร์เนลของมัน) echo/bin/shdash
Stéphane Chazelas

และนี่คือเหตุผลว่าทำไมฉันถึงใส่ตัวละครในสคริปต์ของฉันเมื่อฉันต้องการมัน

คำตอบ:


20

เพราะคุณใช้shไม่bashแล้วechoคำสั่งในไม่มีตัวเลือกsh -eจากshmanpage:

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.

และมันก็ไม่มี\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
หลายคนshสนับสนุนการใช้งานecho -eในเวลารวบรวมสามารถบอกว่าจะไม่สนับสนุนbash echo -eเป็นเพียงแค่ว่าsh (อาจdash) ไม่สนับสนุน-eในขณะที่เฉพาะbashนั้น
Stéphane Chazelas

17

-eไม่ใช่ POSIX (อันที่จริงแล้ว POSIX echo ไม่ยอมรับตัวเลือก (แม้ว่าจะได้รับอนุญาตให้รองรับ-n) ดูที่นี่ ) และ/bin/shในระบบของคุณดูเหมือนจะเป็น POSIX เชลล์ -eเป็นส่วนขยายที่ยอมรับในเชลล์บางตัว แต่คุณไม่ควรพึ่งพามัน แต่เป็นแบบพกพาไม่ได้ จะเป็นการดีที่การใช้งานหรือเปลี่ยนไปใช้เปลือกที่มีprintfecho -e

ยังเห็นคำเตือนของในความคิดเห็นด้านล่างซึ่งจะถูกแทนที่ด้วย\e\033

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

3
ตามที่ gnouc ชี้ให้เห็นshก็ไม่รู้จัก\eเช่นกัน ใช้\033
rici

4

โปรดทราบว่าในเวลาใด ๆ และในเกือบเปลือกใด ๆ คุณสามารถคิดออกซึ่ง "ก้อง" จะถูกเรียกโดยการพิมพ์หรือtype echo which echoมันมักจะเป็นตัวเชลล์ ดังนั้นขึ้นอยู่กับ "echo" ที่ติดตั้งและเชลล์ที่คุณใช้


4
which echoไม่ควรใช้มันอาจจะไม่บอกคุณว่าคุณกำลังใช้ builtin หรือไม่เพราะwhichโดยปกติแล้วจะเป็นไบนารีภายนอก typeเป็นสิ่งที่ดี แต่
Chris Down

1
เห็นได้ดีถึงแม้ว่าบนเชลล์หลักของฉัน (zsh) มันเป็น builtin (ตามที่เปิดเผยโดยtype whichหรือwhich which) ;)
piojo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.