echo newline character ไม่ทำงานในการทุบตี


13

ฉันมีสคริปต์ทุบตีซึ่งมีจำนวนมากechoงบและฉัน aliased echoการecho -eทั้งใน.bash_profileและ.bashrcเพื่อให้สายใหม่จะมีการพิมพ์อย่างถูกต้องสำหรับคำสั่งเช่นecho 'Hello\nWorld'การส่งออกที่ควรจะเป็น

Hello
World

แต่ผลลัพธ์ที่ฉันได้รับคือ

Hello\nWorld

ฉันลองใช้shopt -s expand_aliasesในสคริปต์มันก็ไม่ได้ช่วยอะไร

ฉันใช้สคริปต์ของฉันเป็นbash /scripts/scriptnm.sh; ถ้าฉันเรียกใช้ในขณะที่. /scripts/scriptnm.shฉันได้รับผลลัพธ์ที่ต้องการ ...


3
aliasing echoอย่างที่คุณต้องการคือการปฏิบัติที่ไม่ดี IMHO
shellholic

1
ใช้เครื่องหมายอัญประกาศคู่เพื่อให้ \ n ถูกตีความ เครื่องหมายคำพูดเดี่ยวป้องกันการตีความ \ \ และสิ่งอื่น ๆ
BillThor

คำตอบ:


16

ประวัติความเป็นมาที่หลากหลายของechoการดำเนินการเริ่มต้นนั้นแตกต่างกันไปตามเชลล์ POSIX ระบุว่าผลลัพธ์ของecho“ การกำหนดตามการนำไปใช้” หากอาร์กิวเมนต์แรกเป็น-nหรืออาร์กิวเมนต์ใด ๆ มีเครื่องหมายแบ็กสแลช

มีความน่าเชื่อถือมากกว่าที่จะใช้printf(ไม่ว่าจะเป็นคำสั่งในตัวหรือคำสั่งภายนอก) ซึ่งมีการกำหนดลักษณะการทำงานได้ดีกว่า: เครื่องหมายแบ็กสแลชแบบ C-style และตัวระบุรูปแบบได้รับการสนับสนุนในสตริงรูปแบบ (อาร์กิวเมนต์แรก)

printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar

คุณสามารถควบคุมการขยายตัวของลำดับหนีทับขวาของทุบตี ‘s echoในตัวคำสั่งกับxpg_echoตัวเลือกเปลือก

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

shopt -s xpg_echo
echo 'foo\nbar'

shopt -s xpg_echo; ทำงานให้ฉัน
Bashuser

6

เมื่อคุณใช้bash myfile.shBash จะทำงานในโหมด "batch" ในกระบวนการที่แยกต่างหากและจะไม่อ่านโปรไฟล์หรือ rcfile

เมื่อคุณใช้. myfile.shไฟล์จะถูกหามาโดยกระบวนการเชลล์ปัจจุบัน (ราวกับว่าเนื้อหานั้นถูกพิมพ์โดยคุณ) ดังนั้นมันจะเห็นนามแฝงที่คุณกำหนดไว้ในปัจจุบัน

โดยทั่วไปแล้วมันเป็นความคิดที่แย่มากในการเขียนสคริปต์ที่ขึ้นอยู่กับการกำหนดค่าเปลือกเฉพาะใด ๆ โดยเฉพาะนามแฝงเว้นแต่คุณจะกำหนดไว้ในสคริปต์ของตัวเอง ( อย่าพึ่งพาผู้ใช้.bashrcแม้ว่าจะเป็นของคุณเอง)


5

แนวทางปฏิบัติที่แนะนำคือการใช้printfกับสคริปต์ใหม่ทั้งหมด

printf '%s\n%s\n' "Hello" "World"

printf '%s\n' "Hello\nWorld"

+1 printf นั้นซับซ้อนกว่าการใช้เล็กน้อยกว่า echo แต่มันก็คุ้มค่ามากกว่าในการหลีกเลี่ยงความไม่สอดคล้องของ echo
Gordon Davisson

1

ใช้งานได้ดีในเทอร์มินัล

#!/bin/bash
alias echo="echo -e"
echo "Hello\nWorld"

บันทึกลงในไฟล์และทำให้เป็นไฟล์ exeutable (chmod + x)

เรียกใช้เป็น. /your_file


รันเป็นทุบตี your_file และตรวจสอบผลลัพธ์
Bashuser

ทำงานตามที่คาดไว้
LaLeX

แต่ echo "Hello \ nWorld" ไม่แสดงผลลัพธ์ที่คาดหวัง ในฐานะที่เป็นเสียงสะท้อนใช้นามแฝงแล้วที่จะสะท้อน -e ที่ควร แต่ที่ไม่ได้ทำงานและ thats คำถามของฉัน
Bashuser

เนื่องจากเป็นวิธีปฏิบัติที่ไม่ถูกต้องสำหรับ alias echo (โปรแกรมที่ขึ้นอยู่กับว่ามันอาจแตก) คุณควรลบ alias และในการค้นหาสคริปต์ของคุณสำหรับ echo end ให้แทนที่ด้วย echo -e
LaLeX

ขอบคุณ LaLex มากสำหรับคำตอบของคุณมีวิธีที่ฉันสามารถบรรลุผลตามที่คาดหวังด้วยนามแฝงแม้ว่ามันจะไม่ใช่วิธีปฏิบัติที่ดี
Bashuser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.