Làm thế nào để khác một tập tin và đầu ra từ lệnh?


32

Thông thường bạn sẽ viết:

diff file1 file2

Nhưng tôi muốn khác một tập tin và đầu ra từ lệnh (ở đây tôi làm cho lệnh trở thành một thứ tầm thường):

diff file1 <(cat file2 | sort)

Ok, công việc này khi tôi nhập thủ công này tại dấu nhắc shell, nhưng khi tôi đặt chính xác cùng một dòng trong tập lệnh shell, và sau đó chạy tập lệnh, tôi gặp lỗi.

Vì vậy, câu hỏi là - làm thế nào để làm điều này một cách chính xác?

Tất nhiên tôi muốn tránh ghi đầu ra vào một tập tin tạm thời.

Câu trả lời:


39

Tôi nghi ngờ kịch bản của bạn và vỏ của bạn là khác nhau. Có lẽ bạn có #!/bin/shở đầu tập lệnh của mình với tư cách là người phiên dịch nhưng bạn đang sử dụng bashlàm vỏ bọc cá nhân. Bạn có thể tìm ra shell nào bạn chạy trong terminal bằng cách chạy echo $SHELL.

Một cách dễ dàng hơn để làm điều này sẽ hoạt động trên hầu hết các shell sẽ là sử dụng chuyển hướng đường ống thay vì toán tử đọc tệp bạn đưa ra. Ký hiệu '-' là một danh pháp tiêu chuẩn để đọc STDIN và thường có thể được sử dụng để thay thế cho tên tệp trong danh sách đối số:

cat file2 | sort | diff file1 -

Hoặc để tránh việc sử dụng mèo vô dụng :

sort < file2 | diff file1 -

Ah, bạn tốt, thực sự, tôi đã không kiểm tra xem sh có phải là bash hay không. Cảm ơn bạn rất nhiều cho giải pháp.
greenoldman

Nó là tập tin khác với thiết bị xuất chuẩn. Bây giờ làm thế nào để khác biệt stdout với một tập tin? Ý tôi là, hướng ngược lại. đó là -Rtrong trường hợp sử dụnggit diff --no-index
Nakilon

@Nakilon Bạn chỉ cần thay đổi thứ tự đối số : diff - file1.
Caleb

Mát mẻ. Điều này đã không làm việc cho git diff.
Nakilon

@Nakilon Tất nhiên là không, tại sao vậy? git difflà một con thú hoàn toàn khác và hoạt động dựa trên các tham chiếu đến các đối tượng toàn cầu trong chỉ mục nội bộ của nó, không phải các tệp; diffhoạt động trên hệ thống tập tin. Các -cú pháp chỉ là shell cú pháp đường cho /dev/stdin, các tập tin đại diện cho dòng STDIN. Do đó tại sao diffcó thể sử dụng nó để thay thế cho một tên tập tin. Trong khi đó git diffkhông tìm kiếm tập tin, nó đang tìm kiếm các đối tượng để bạn phải truyền cho nó thứ gì đó mà nó nhận ra. Đừng sử dụng nó để so sánh các tệp với nhau, hãy sử dụng diffnó.
Caleb

-4

Phạm vi của đầu vào tiêu chuẩn chính là tập lệnh, vì vậy chỉ cần đặt mã của bạn vào trong một khối như thế này:

{
  diff file1 <(sort file2)
}

Theo cách này, phạm vi của STDIN nằm trong khối ..

Tôi đã thử và nó hoạt động.


Đó không phải là một chức năng, nó là một khối và nó không tạo ra sự khác biệt nào.
Gilles 'SO- ngừng trở nên xấu xa'

@gilles Thx cho sửa. BTW Tôi đã thử bản thân mình và nó hoạt động. Bạn đã?
tmow

3
Khối này không có bất kỳ ảnh hưởng nào đến tính hợp lệ của <(…)cấu trúc. Kịch bản của bạn sẽ hoạt động hay không hoạt động tùy thuộc vào việc bạn có chạy nó trong trình bao hỗ trợ <(…)hay không (ksh93 / bash / zsh vs Bourne / ash / kshk88). Caleb's trả lời tất cả.
Gilles 'SO- ngừng trở nên xấu xa'

1
@gilles ok, thx cho lời giải thích.
tmow
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.