Làm cách nào để sử dụng << << trong tệp bó hoặc dấu nhắc lệnh?


12

Tôi biết những gì >> được sử dụng cho, nó viết tất cả các tin nhắn vào một tập tin thay vì màn hình. Và tôi đoán << làm ngược lại, tôi thử nó và nhận được một tin nhắn: << was unexpected at this time.

Vui lòng cho tôi biết đó là gì << được sử dụng cho và làm thế nào để sử dụng.

Câu trả lời:


17

Trình vỏ lệnh Windows tiêu chuẩn - cmd.exe - không sử dụng << nhà điều hành ở tất cả

Một đơn < có nghĩa là "đọc tập tin vào đầu vào tiêu chuẩn " đến cmd.exe, nhưng hai < back-to-back là vô nghĩa đối với cmd.exe, vì vậy nó đưa ra lỗi bạn gặp phải.

Các << nhà điều hành có ý nghĩa đối với tất cả các loại chính Shell lệnh Unix , nơi nó được sử dụng cho tài liệu ở đây : ²

$ some-command <<END
blah blah blah
blah blah
blah blah blah blah blah
END

Ba dòng đó được gửi đến some-command trên đầu vào tiêu chuẩn của nó.

Điều này hữu ích để gửi nhiều văn bản vào một lệnh mà không cần viết nó vào một tệp trước, như bạn phải làm với < nhà điều hành. Tôi thường xuyên sử dụng nó để nhúng một thông điệp "sử dụng" vào một tập lệnh:

#!/bin/sh
if [ -z "$1" ]
then
    cat <<USAGE
usage: myscript <files...>

     Grobbles the foobie for all files given on the command line.

USAGE

    exit 1
fi

# ... do something with command line arguments

Điều này tốt hơn là viết một loạt echo báo cáo vì văn bản heredoc được định dạng chính xác như nó in ra màn hình. Ngoài ra, dễ dàng hơn để xử lý khoảng trắng, trích dẫn, chuyển hướng và nội suy biến trong bối cảnh này. Ví dụ, lưu ý rằng tôi đã sử dụng dấu ngoặc góc trong thông báo sử dụng mà không cần phải làm gì khéo léo để ngăn vỏ cố gắng sử dụng chúng để chuyển hướng I / O.

Nếu bạn muốn làm những việc như thế này trên Windows, bạn có thể cài đặt Cygwin và sử dụng một trong các vỏ của nó. Nếu bạn đang dùng Windows 10, bạn có thể sử dụng WSL thay thế.


Chú thích:

  1. Liên kết đó đi vào cây tài liệu Windows XP được lưu trữ. Microsoft đã phá vỡ liên kết mà tôi đã sử dụng trước đây khi họ lưu trữ các tài liệu này, vì vậy trong trường hợp họ phá vỡ lại, đây là một tài liệu tham khảo của bên thứ ba dự phòng.

    Chỉ khác cmd.exe tài liệu tham khảo mà tôi biết trên microsoft.com là Lệnh Windows PDF . cmd lời nhắc. PDF này không đầy đủ trên hai cơ sở. Đầu tiên và có liên quan nhất ở đây, không có thảo luận kết hợp về cách chuyển hướng hoạt động trong cmd.exe vỏ; thậm chí không có một cuộc thảo luận về ngữ pháp shell. Thứ hai, danh sách lệnh của PDF không đầy đủ: điều đầu tiên tôi tình cờ kiểm tra không được đề cập: diskpart.

    Tôi tin rằng tất cả những điều này xuất phát từ những nỗ lực rõ ràng của Microsoft để thay thế cmd.exe với PowerShell , đã diễn ra trong nhiều năm nay. Trong bản cập nhật Windows 10 gần đây nhất khi viết bài này, họ có thực hiện các bước tiếp theo để che giấu sự tồn tại của cmd.exe, mặc dù nó chưa hoàn toàn biến mất

    Điều đáng chú ý là PowerShell cũng không hỗ trợ << toán tử chuyển hướng . Cũng không - trong một hồi quy buồn từ cả shell Unix và cmd.exe - nó có hỗ trợ không < chuyển hướng!

  2. Cách chính tắc để bắt đầu một tài liệu ở đây là như tôi đã viết ở trên, không có khoảng cách giữa << và từ phân cách. Hồi ức mờ nhạt của tôi là tất cả các sử dụng tài liệu ở đây mà tôi đã thấy trong các kịch bản shell cũng được thực hiện theo cách này. Đặc tả POSIX cho tài liệu ở đây cũng sử dụng phong cách này trong các ví dụ của nó.

    Tuy nhiên, đọc kỹ các phần khác của Đặc điểm kỹ thuật POSIX.1-2008 tiết lộ rằng việc đặt một số ký tự khoảng trắng hoặc tab giữa << và từ phân cách. Đặc biệt, xem quy tắc nhận dạng mã thông báo 7 và 10 , định nghĩa của io_here trong ngữ pháp vỏ và định nghĩa của lớp nhân vật "trống" .

    Cái đó là cách bạn ghi lại một cái vỏ. Ghi chú, Microsoft. ;)

    Thử nghiệm ở đây trên Bash 4 và ksh93 xác nhận rằng điều này hoạt động như mong đợi.


Không thể nói nó tốt hơn bản thân mình. Ngoại trừ tôi sẽ không đề cập đến Cygwin vì đơn giản là đôi khi bạn làm trong Windows và những thứ khác bạn làm với Unix. Có rất nhiều khả năng tương thích chéo, tuy nhiên tôi rất khuyến nghị chỉ nên học Unix thô thay vì một số công việc ảo xung quanh như Cygwin hoặc một số tiện ích dựa trên Win khác.
BiTinerary

8
@BiTinerary: Cho rằng một số lượng lớn người sử dụng Cygwin hàng ngày cụ thể để có thể thực hiện những việc giống như Unix trên Windows, tôi nghĩ rằng tôi sẽ để lại gợi ý đó trong câu trả lời.
Warren Young

Phải, tôi không có ý gỡ rối tính xác thực đó là Cygwin, tôi sử dụng nó cho các nhiệm vụ trần tục bây giờ và sau đó. Tôi chỉ cần bỏ hai xu của mình để khởi động thực tế và học được rằng (đặc biệt là cho người mới bắt đầu) tốt hơn là học một thứ gì đó của bên thứ 3 hoặc một bản gốc của hệ điều hành hoàn toàn khác. Tôi chỉ muốn nói rằng trong khoảng thời gian cần thiết để thiết lập Cygwin, chỉ định tất cả các mô-đun đi kèm + bắt đầu sử dụng nó, bạn có thể đã học được rất nhiều điều trong thực tế. Tôi cảm thấy như Cygwin là những gì bạn sử dụng sau khi bạn đã làm điều đó và chỉ không muốn khởi động lại
BiTinerary

Nited: để loại bỏ những người sử dụng dấu gạch chéo ngược trong dữ liệu hoặc trích dẫn (ít nhất một char của) từ phân cách trên dòng lệnh.
dave_thompson_085


4

> ghi vào một tệp MỚI.

>> nối vào một tập tin

< đọc từ một tập tin

| gửi một đầu ra lệnh vào đầu vào của lệnh khác

Xem ở đây để xem danh sách Việc gõ% ^ vào cmd.exe là trứng Phục sinh Windows?

Kể từ đó đã được đăng này đã được thêm vào.

Starting a Program
===============

See start /? and call /? for help on all three ways.

Specify a program name
--------------------------------

    c:\windows\notepad.exe

In a batch file the batch will wait for the program to exit. When
typed the command prompt does not wait for graphical
programs to exit.

If the program is a batch file control is transferred and the rest of the calling batch file is not executed.

Use Start command
--------------------------

    start "" c:\windows\notepad.exe

Start starts a program and does not wait. Console programs start in a new window. Using the /b switch forces console programs into the same window, which negates the main purpose of Start.

Start uses the Windows graphical shell - same as typing in WinKey + R (Run dialog). Try 

    start shell:cache

Use Call command
-------------------------

Call is used to start batch files and wait for them to exit and continue the current batch file.
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.