Cách liệt kê các mô tả tệp đang mở (và các tệp mà chúng tham chiếu) trong phiên bash hiện tại của tôi


23

Tôi đang chạy trong một phiên bash tương tác. Tôi đã tạo một số mô tả tệp, sử dụng exec và tôi muốn liệt kê trạng thái hiện tại của phiên bash của tôi.

Có cách nào để liệt kê các mô tả tập tin hiện đang mở?


1
kiểm tra liên kết
Kamaraj

@Kamaraj cảm ơn. Vì vậy, bash không có tích hợp để làm điều đó? Tôi cần sử dụng các tính năng dành riêng cho linux?
dangonfast

bashkhông phải là một phần của kernel, vì vậy nó không thể biết các tiến trình khác đang làm gì, ngay cả những tiến trình mà nó đã bắt đầu.
Julie Pelletier

@JuliePelletier: nhưng các quy trình con không thay đổi các mô tả tệp của quy trình cha, phải không?
dangonfast

Câu trả lời:


27

Có, điều này sẽ liệt kê tất cả các mô tả tập tin mở:

$ ls -la /proc/$$/fd
total 0
dr-x------ 2 sorontar sorontar  0 Dec 28 00:56 .
dr-xr-xr-x 9 sorontar sorontar  0 Dec 28 00:56 ..
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 0 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 1 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 2 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 255 -> /dev/pts/6
l-wx------ 1 sorontar sorontar 64 Dec 28 00:56 4 -> /home/sorontar/testfile.txt

Tất nhiên, như thường lệ: 0 là stdin, 1 là stdout và 2 là stderr.
Thứ 4 là một tệp mở (để viết) trong trường hợp này.


Điều đó chỉ liệt kê quá trình hiện tại, không phải con cái hoặc cha mẹ của nó.
Julie Pelletier

@JuliePelletier Tiêu đề câu hỏi có nội dung 'phiên bash hiện tại của tôi'. Tôi có hiểu sai không?
sorontar

@JuliePelletier: tại sao tôi lại quan tâm đến các mô tả tập tin được sử dụng bởi trẻ em hoặc phụ huynh của phiên bash hiện tại của tôi? Tôi chỉ quan tâm đến các mô tả tập tin đang được sử dụng bởi phiên bash hiện tại của tôi.
dangonfast

@delavnog: Tốt rồi. Nếu điều đó trả lời câu hỏi của bạn, bạn nên đánh dấu nó như vậy.
Julie Pelletier

4

Giả sử bạn muốn liệt kê các mô tả tệp được gắn vào bất kỳ thiết bị đầu cuối nào, bạn có thể sử dụng lsof/ fuserhoặc tương tự như:

$ lsof -p $$ 2>/dev/null | awk '$NF ~ /\/pts\//'
bash    32406 foobar    0u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    1u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    2u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    3u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar  255u   CHR 136,31      0t0      34 /dev/pts/31

Các công cụ này về cơ bản phân tích cú pháp /proc, vì vậy bạn chỉ có thể truy cập, /proc/$$/fd/ví dụ:

ls /proc/$$/fd/*

2
Việc lựa chọn \/pts\/từ chối các tệp đang mở nhưexec 4>testfile.txt
sorontar

@sorontar Yep, như tôi đã nói cái này chỉ để liệt kê những cái được gắn vào bất kỳ thiết bị đầu cuối nào.
heemayl

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.