echo nhân vật dòng mới không làm việc trong bash


13

Tôi có tập lệnh bash có rất nhiều echocâu lệnh và tôi cũng đặt bí danh echocho echo -ecả trong .bash_profile.bashrc, để các dòng mới được in đúng cho một câu lệnh như echo 'Hello\nWorld'đầu ra phải là

Hello
World

nhưng đầu ra tôi nhận được là

Hello\nWorld

Tôi thậm chí đã thử sử dụng shopt -s expand_aliasestrong kịch bản, nó không giúp

Tôi đang chạy kịch bản của tôi như bash /scripts/scriptnm.sh; nếu tôi chạy nó khi . /scripts/scriptnm.shtôi nhận được đầu ra mong muốn ...


3
bí danh echonhư bạn muốn là một thực hành tồi IMHO
shellholic

1
Sử dụng dấu ngoặc kép để \ n được diễn giải. Các trích dẫn đơn ngăn cản việc giải thích \ n và một loạt những thứ khác.
BillThor

Câu trả lời:


16

Lịch sử hỗn hợp echocó nghĩa là hoạt động mặc định của nó thay đổi từ vỏ này sang vỏ khác. POSIX xác định rằng kết quả của echolà được xác định bởi triển khai thực hiện nếu một đối số đầu tiên là -nhoặc bất kỳ đối số nào chứa dấu gạch chéo ngược.

Nó đáng tin cậy hơn để sử dụng printf(dưới dạng lệnh tích hợp hoặc lệnh bên ngoài) trong đó hành vi được xác định rõ hơn: thoát dấu gạch chéo kiểu C và các chỉ định định dạng được hỗ trợ trong chuỗi định dạng (đối số đầu tiên).

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

Bạn có thể kiểm soát việc mở rộng chuỗi thoát xuyệc ngược của bash ‘s echobuilt-in lệnh với các xpg_echotùy chọn vỏ.

Đặt nó ở đầu bất kỳ tập lệnh bash nào để echotự động mở rộng dấu gạch chéo ngược mà không phải thêm -evào mỗi lệnh echo.

shopt -s xpg_echo
echo 'foo\nbar'

shopt -s xpg_echo; Đã làm cho tôi.
Bashuser

6

Khi bạn sử dụng bash myfile.sh, Bash được chạy ở chế độ "bó", trên một quy trình riêng biệtkhông đọc hồ sơ hoặc RCfile của nó.

Khi bạn sử dụng . myfile.sh, tệp có nguồn gốc từ quy trình shell hiện tại (như thể nội dung của nó được nhập bởi bạn), do đó nó nhìn thấy các bí danh hiện được xác định của bạn.

Nói chung, việc viết các tập lệnh phụ thuộc vào bất kỳ cấu hình shell cụ thể nào, đặc biệt là các bí danh, trừ khi bạn xác định chúng trong chính tập lệnh là một ý tưởng rất tệ . ( Không bao giờ dựa vào người dùng .bashrc, ngay cả khi đó là của riêng bạn.)


5

Thực hành được khuyến nghị là sử dụng printfcho tất cả các tập lệnh mới.

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

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

+1 printf phức tạp hơn một chút để sử dụng so với echo, nhưng nó còn hơn cả việc tránh sự không nhất quán của echo.
Gordon Davisson

1

Điều này hoạt động tốt trong thiết bị đầu cuối

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

lưu vào một tập tin và làm cho nó trở nên tuyệt vời (chmod + x)

chạy như ./your_file


chạy nó dưới dạng bash your_file và kiểm tra đầu ra.
Bashuser

Hoạt động như mong đợi
LaLeX

nhưng tiếng vang "Hello \ nWorld" không hiển thị đầu ra mong đợi. Vì tiếng vang đã được đặt bí danh cho tiếng vang - nhưng nó không hoạt động và đó là câu hỏi của tôi
Bashuser

Vì thực tế không tốt đối với tiếng vang bí danh (các chương trình phụ thuộc vào nó có thể bị hỏng), bạn nên xóa bí danh và trong tìm kiếm tập lệnh của bạn để kết thúc tiếng vang thay thế bằng tiếng vang -e
LaLeX

Cảm ơn rất nhiều LaLex cho câu trả lời của bạn, có cách nào để tôi có thể đạt được kết quả mong đợi với bí danh mặc dù đó không phải là một cách thực hành tốt
Bashuser
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.