Một chút chuyển hướng vỏ
Dưới đây là làm thế nào chúng tôi thường làm chuyển hướng vỏ
$ ./pgm.sh args >out.txt 2>err.txt
Tôi muốn sửa đổi nó một chút và chạy như sau
$ ./pgm.sh args
với yêu cầu đầu ra đó và lỗi nên đi đến một số tên tập tin bên trong pgm.sh tính toán dựa trên args. Một minh họa trường hợp có thể là khi một ngày là một phần của args. Vì vậy, bạn muốn thiết bị xuất chuẩn để đi đến nói / / thư mục / pgm_out_YYYYMMDD.txt 1
Vấn đề với cách tiêu chuẩn của chuyển hướng N>file.txt có nghĩa là, liên kết mô tả tập tin N file.txt, là nó chỉ hoạt động cho quá trình mới được chia hai và không cho quá trình hiện tại.
do đó,
$ echo hi 1>out.txt ; echo hii . sẽ gửi hi out.txt nhưng sẽ in hii thiết bị xuất chuẩn 2
Đây là nơi exec nói đến cứu hộ của chúng tôi. Nếu chúng ta thêm exec 1>somefile.txt sau đó đầu ra từ phần còn lại của kịch bản sẽ đi somefile.txt
$. / Test.sh sẽ chuyển hướng hi cũng như hii out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Tương tự như vậy, để chuyển hướng thiết bị xuất chuẩn cũng như thiết bị lỗi chuẩn, chúng tôi sẽ làm một cái gì đó như thế này
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Bây giờ quay trở lại điểm ban đầu của chuyển hướng đến một số tập tin từ bên trong vỏ, để nói rằng chương trình tính toán tên tập tin trong một số OUTFILE biến, chúng ta có thể vừa thực hiện exec 1>$OUTFILE
Điều đó giải quyết các vấn đề hiện tại. Nhưng bạn có thể muốn đi qua ví dụ sau đây mà đạt được truy cập ngẫu nhiên của tập tin trong shell script. Ví dụ là từ đây
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
Với ý kiến, mã này là tự giải thích.
-
1 Nó cũng có thể được thực hiện bởi $ ./pgm.sh args >pgm_out`date +%Y%m%d` nhưng ý tưởng là để tạo ra tên tập tin dựa trên một số logic trong chương trình chính nó.
2 1 trong 1> out.txt là không cần thiết, nhưng nó làm rõ ở đây rằng chúng tôi đang chuyển hướng fd 1



































