Lệnh ls hoạt động khác nhau tùy thuộc vào người nhận


12

Làm thế nào để các lệnh như lsbiết thiết bị xuất chuẩn của nó là gì?

Có vẻ như lshoạt động khác nhau tùy thuộc vào thiết bị xuất chuẩn mục tiêu là gì. Ví dụ: nếu tôi làm:

ls /home/matt/tmp 

kết quả là:

a.txt b.txt c.txt

Tuy nhiên nếu tôi làm

ls /home/matt/tmp | cat

kết quả là (tức là dòng mới trên mỗi kết quả):

a.txt
b.txt
c.txt

Quá trình được thông qua một mô tả tập tin 1 cho thiết bị xuất chuẩn phải không? Làm thế nào để xác định làm thế nào để định dạng kết quả? Liệu mô tả tập tin tiết lộ thông tin?


Liên quan unix.stackexchange.com/q/157285/4671 , unix.stackexchange.com/q/63108/4671 và có lẽ những người khác. Nó dường như là một chủ đề phổ biến. Đây có thể là một bản sao của một trong số này.
Faheem Mitha

Câu trả lời:


22

Các lssử dụng chương trình isatty()để biết liệu fd 1 là một tty hay cái gì khác (đường ống, tập tin, vv ...). Từ man 3 isatty:

int isatty(int fd);

MÔ TẢ
Các isatty()xét nghiệm chức năng dù fdlà một bộ mô tả tập tin mở đề cập đến một thiết bị đầu cuối


Cập nhật: Dòng 1538 trong ls.ctừ coreutils (bản sửa đổi git 43a987e1):

  if (isatty (STDOUT_FILENO))
    {
      format = many_per_line;
      /* See description of qmark_funny_chars, above.  */
      qmark_funny_chars = true;
    }

( many_per_linenên tự mô tả.)


8

Không phải là một câu trả lời chính xác mà là một ví dụ. Trong tập lệnh Bash, bạn có thể đạt được hiệu ứng tương tự với test/ [['s -t:

-t FD True if FD is opened on a terminal.

Sử dụng nó như thế này:

bash-4.2$ where() { [[ -t 1 ]] && echo 'my output goes to TTY' || echo 'my output is redirected'; }

bash-4.2$ where
my output goes to TTY

bash-4.2$ where | cat
my output is redirected

bash-4.2$ where > test.file
bash-4.2$ cat test.file
my output is redirected

6

Từ ls(1) hướng dẫn OpenBSD :

Theo mặc định, ls liệt kê một mục nhập trên mỗi dòng cho đầu ra tiêu chuẩn; các ngoại lệ là cho các thiết bị đầu cuối hoặc khi các tùy chọn -C, -m hoặc -x được chỉ định.

Sau đó, sau:

-1 (Chữ số số `` một ''.) Buộc đầu ra là một mục nhập trên mỗi dòng. Đây là mặc định khi đầu ra không đến một thiết bị đầu cuối.

[...]

-C Lực lượng đầu ra đa cột; Đây là mặc định khi đầu ra là một thiết bị đầu cuối.


1

Bạn có thể thực thi lstrong một thiết bị đầu cuối giả bằng cách sử dụng script lệnh, chuyển đầu ra của lsmột lệnh khác và có cùng định dạng đầu ra như thể không có đường ống nào của luồng đầu ra, ví dụ như thiết bị xuất chuẩn là một thiết bị đầu cuối (tty).

Đối với các cơ isatty()chế đã được chỉ ra bởi Stéphane Gimenez thấy ls.c .

ls -G /
ls -G / | cat
script -q /dev/null ls -G / | sed $'s/\r$//g' | cat

# tty | cat
# script -q /dev/null tty | cat
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.