Làm thế nào để in Nhật -n mà không phát hành một dòng mới?


16

Tôi đang cố gắng in -nbằng echolệnh. Nhưng nếu tôi chỉ đơn giản gõ echo -n, nó chỉ phát hành một dòng mới, không hiển thị -n, thay vào đó nó phát hành một dòng mới.


echo -n -- -nhoạt động không (không có hộp linux nào tiện để kiểm tra)?
n0rd

Tôi đang cài đặt Ubuntu trong một máy ảo và có vẻ như nó rất chậm, chờ đã.
Hệ điều hành sao

1
Tôi đã kiểm tra - không. Có lẽ bởi vì đó là lệnh bash nội bộ và nó không sử dụng getopt(???) để phân tích dòng lệnh
n0rd

1
Câu hỏi này được hỏi và trả lời trong pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "Phù hợp các ứng dụng mà ... có thể có thể được hy vọng vang một -n, nên sử dụng tiện ích printf có nguồn gốc từ lần thứ IX Hệ thống phiên bản "
Brandin

Câu hỏi phổ biến đầu tiên tôi đã thực hiện. Vâng
Hệ điều hành sao

Câu trả lời:


28

Vấn đề là echogiải thích -nnhư là một đối số. Trên triển khai bash mặc định, điều đó có nghĩa là (từ help echo):

  -n  do not append a newline

Có nhiều cách khác nhau để giải quyết vấn đề đó:

  1. Biến nó thành một thứ không phải là một lựa chọn bằng cách bao gồm một nhân vật khác. Ví dụ, yêu cầu echokhông in một dòng mới với -n, sau đó yêu cầu nó giải thích các dấu gạch chéo ngược -evà thêm dòng mới một cách rõ ràng.

    $ echo -ne '-n\n'
    -n
  2. Ngoài ra, chỉ bao gồm một không gian

    $ echo " -n"
     -n

    Điều đó, tuy nhiên, thêm một không gian mà bạn có thể không muốn.

  3. Sử dụng một ký tự không in trước nó. Đây. Tôi đang sử dụng backspace ( \b)

    $ echo -e "\b-n"
    -n

    Điều này cũng thêm một nhân vật mà bạn có thể không muốn.

  4. Sử dụng mánh khóe

    $ echo n- | rev
    -n

    Các revlệnh đơn giản in sản lượng của nó bị đảo ngược.

  5. Sử dụng công cụ phù hợp cho công việc

    $ printf -- '-n\n'
    -n

Bạn đúng rằng bất kỳ ký tự hợp lệ `\` nào cũng được.
Pilot6

@ Pilot6 yeah, nhưng vấn đề với cách tiếp cận đó (của bạn và của tôi) là nó có thêm một nhân vật. Điều đó có thể gây ra vấn đề xuống dòng. Đặc biệt là nếu sau đó bạn muốn phân tích nó và thử một cái gì đó như grep '^-n'. pritnflà con đường để đi, thực sự.
terdon

Vâng, printfdù sao cũng tốt hơn, nhưng câu hỏi liên quan đến chỉ echo.
Pilot6

2
Có vẻ như echo -e "-n\c"làm điều chính xác.
Pilot6

1
\cđang ngăn chặn sản lượng tiếp theo
Pilot6


7

Bạn có thể sử dụng lệnh này, nhưng nó thêm một không gian bổ sung.

echo -e  "\r-n"

Đây là một loại hack.

-e cho phép ký hiệu dấu gạch chéo ngược.

\r là một sự trở lại xe ngựa.

Trên thực tế, bất kỳ \ký tự hợp lệ sẽ làm ở bất kỳ vị trí nào của chuỗi.

Bạn có thể thấy cái nào hợp lệ bởi help echo.

echo "-n"không hoạt động vì -nđược sử dụng làm tham số cho echo.

PS Giải pháp tốt nhất IMHO là

echo -e "-n\c"

Nó không thêm bất kỳ ký tự nào .

echo -e "-n\n"

in giống nhau nhưng với một dòng char mới.


1
Ôi! Điều này tốt hơn của tôi; bạn có thể giải thích một chút cho "người mới bắt đầu" ;-)
Sadi

Cảm ơn, tôi cũng nhận thấy rằng việc bạn thêm tiền gửi xe vào lúc bắt đầu hay lúc kết thúc không thành vấn đề.
Sadi

@Sadi có, đó là bởi vì thêm bất cứ điều gì làm cho nó trở thành một lựa chọn không hợp lệ. -nlà hợp lệ, -nfookhông phải như vậy sẽ được in.
terdon

@terdon man echocũng có nó. Nhưng helptốt hơn một chút.
Pilot6

Tôi biết nó có nó, nó chỉ không liên quan. /bin/echolà một điều hoàn toàn khác và khi bạn chạy echotrong bash, bạn sẽ nhận được nội dung có thể khá khác nhau tùy thuộc vào vỏ của bạn.
terdon

5

Tôi nghĩ rằng nếu bạn chắc chắn chỉ muốn sử dụng echo, điều này sẽ làm bạn hài lòng:

echo "-n "

Điều này hoạt động bởi vì while -nlà một tùy chọn hợp lệ cho echo, -nvới một khoảng trắng sau nó thì không. Vì nó không phải là một lựa chọn, echochỉ cần in nó.


Hầu hết người xem ở đây có thể chỉ muốn "-n", không phải "-n".
Hệ điều hành sao

5

Các bạn đang thực sự lật đổ nó.

 echo -e \\055n

Hoặc không có dòng mới

 echo -en \\055n

Làm thế nào là printf "-n\n" một suy nghĩ quá mức?
Dmitry Grigoryev

Yup, tôi chỉ trả lời theo cách này. Sẽ xóa câu trả lời của tôi. Điều này tương đối di động ở chỗ nó hoạt động với tiếng vang tích hợp và /bin/echoít nhất là nếu được gọi làecho -e "\055n"
abligh

-en không phải là điều tôi muốn.
Hệ điều hành sao

2

Để mở rộng câu trả lời của @ AB, cách duy nhất để sử dụng echolà không sử dụng bất kỳ tùy chọn nào như -n. Cân nhắc sử dụng printfthay vì nơi có sẵn. Trang tham khảo này cung cấp thêm chi tiết và giải thích rất rõ khi nào echoprintfnên sử dụng như thế nào :

Ngày nay, echo (1) chỉ có thể mang theo nếu bạn bỏ qua các cờ và thoát các chuỗi. Sử dụng printf (1) thay vào đó, nếu bạn cần nhiều hơn văn bản thuần túy.


Tôi sẽ mở rộng câu trả lời, vui lòng chỉnh sửa câu trả lời.
Hệ điều hành sao

Tôi không chắc chắn nên thay đổi câu trả lời của người khác đến mức khi nào nó sẽ có nhiều văn bản từ tôi hơn là từ tác giả ban đầu.
Dmitry Grigoryev

2

Trong tập lệnh Bash, bạn có thể chạy:

echo -n -
echo n

Hoặc trong vỏ tương tác:

echo -n - ; echo n

Đây echolà một -nhân vật và một nnhân vật.


Bạn đã thử à? Đó là sai.
Pilot6


Đầu ra lệnh đầu tiên -pilot6@Pilot6:~$. Các đầu ra thứ hai n.
Pilot6

@ Pilot6 Phụ thuộc vào việc bạn đang chạy nó trong thiết bị đầu cuối tương tác hay trong tập lệnh bash, không được chỉ định trong câu hỏi. OTOH nếu bạn cần nó trong thiết bị đầu cuối, thật đơn giản chỉ cần kết hợp hai dòng với &&- tôi thực sự sẽ không nói câu trả lời này là sai .
dùng12205

Tôi sẽ chỉnh sửa nó để nó trở nên rõ ràng hơn nhiều đối với tập lệnh bash.
Hệ điều hành sao

1

Ba cách khác:

$ echo -e '\x2dn' # ASCII hexadecimal value
-n
$ echo -e '\u002dn' # Unicode code point
-n
$ echo -e '\u2dn' # Unicode code point shortened
-n

0

Bạn có thể chạy

printf -n;echo

Đã thử nghiệm trong Busybox Ash


Tro? Tro? Ý tôi là gì?
Hệ điều hành sao

Tôi đã chạy 'busybox ash'
jiwopene

Nói "Busybox" hoặc "Busybox Ash". Không chỉ beacuse "Ash" mọi người có thể nghĩ về nhân vật pokemon đó hoặc tro ****** từ núi lửa.
Hệ điều hành sao

Tốt hơn. alt255alt255
Sao OS

@StarOS ashlà tên của Shell Almquist.
muru
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.