Trong một tập lệnh, kiểm tra xem đầu vào tiêu chuẩn đến từ một tập tin hoặc đường ống


7

Tôi biết điều này đã được bảo hiểm kém trước đây, nhưng những câu trả lời đó hoặc thiếu giải thích hoặc không áp dụng.

Về cơ bản tại một số điểm, tập lệnh của tôi cần kiểm tra xem một tập tin có được chỉ định hay không, nếu nó được sử dụng sau này làm đầu vào.

[ -f "$1" ] && TINPUT="$1"

đủ đơn giản ... Bây giờ nếu một tập tin không được tìm thấy hoặc không được chỉ định, tôi sẽ có TINPUT="-"lệnh này để đọc lệnh sau để đọc stdin.

Đây là câu hỏi của tôi ... Làm thế nào để tập lệnh chết vì lỗi, nếu nó được chạy mà không có đường ống hoặc không có tệp được chỉ định?

Tôi đang sử dụng dấu gạch ngang, trình bao tuân thủ Debian POSIX, vì vậy tôi không thể sử dụng Bashism. Tôi cũng thích sử dụng danh sách hơn, ifsnhưng hầu hết ifscó thể được viết trong danh sách.


Bạn có ý nghĩa gì với những người không có một đường ống? Nếu không có tên tệp được chỉ định, đọc từ stdin. Nhiều hơn những gì bạn muốn?
Gilles 'SO- đừng trở nên xấu xa'

Câu hỏi của tôi bắt đầu bằng 'Đây là câu hỏi của tôi .. ", có nghĩa là nếu người dùng chỉ tự chạy tập lệnh. Vì vậy, nếu dữ liệu sẽ không bao giờ đi qua stdin, bởi vì nó thậm chí không bao giờ được gọi sau một |vị trí đầu tiên. điều đó là không thể, điều mà tôi tin là có thể không, việc kiểm tra dữ liệu cũng sẽ đủ. Về cơ bản tôi muốn đoạn script kết thúc và nói, 'script cần một tên tệp, hoặc stdin', thay vì chỉ treo không có đầu ra vĩnh viễn như bây giờ.
JM Becker

Câu trả lời:


6

Bạn có thể kiểm tra xem đầu vào tiêu chuẩn có phải là thiết bị đầu cuối không:

if [ -n "$1" ]; then
  exec <"$1"
elif tty >/dev/null; then
  echo 1>&2 'Cowardly refusing to read data from a terminal.'
  exit 2
# else we're reading from a file or pipe
fi

Tôi nghĩ rằng tôi có thể lấy nó từ thời điểm này, cảm ơn sự giúp đỡ của bạn.
JM Becker

Lưu ý rằng GNU ttyhỗ trợ chế độ im lặng : tty -sthay vìtty > /dev/null
giám mục
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.