یکی از رایج‌ترین کارها هنگام نوشتن اسکریپت‌های Bash یا هنگام کار برروی خط فرمان لینوکس، خواندن و نوشتن فایل‌ها است.

در این مقاله، نحوه نوشتن متن در فایل توسط Bash با استفاده از عملگرهای تغییر مسیر (redirection operator) و دستور tee شرح داده شده است.

 

 

نوشتن در فایل با استفاده از عملگرهای تغییر مسیر

در Bash، تغییر مسیر خروجی به شما امکان می‌دهد، خروجی را از یک دستور گرفته و آن را در یک فایل بنویسید.

قالب کلی برای تغییر مسیر و نوشتن خروجی در یک فایل به شرح زیر است:

output > filename 
output >> filename 

عملگر تغییر مسیر < خروجی را در یک فایل مشخص می‌نویسد. در این دستور، اگر فایل وجود داشته باشد، خالی می‌شود؛ در غیر این صورت، یک فایل ایجاد می‌شود. هنگام استفاده از این عملگر بسیار احتیاط کنید؛ زیرا ممکن است یک فایل مهم را بازنویسی نمایید.

عملگر تغییر مسیر << خروجی را به انتهای یک فایل معین اضافه می‌کند. در اینجا نیز اگر فایل وجود نداشته باشد، ایجاد می‌شود.

هنگام استفاده از این عملگرها، شما باید مجوز نوشتن در فایل را داشته باشید. در غیر این صورت، یک خطای انکار مجوز دریافت خواهید کرد.

 

این مطلب نیز ممکن است برای شما مفید باشد: 10 روش برای مشاهده فرمت های مختلف فایل در لینوکس

 

در اینجا، یک مثال ساده نشان داده شده است که در آن، چگونگی تغییر مسیر خروجی دستور echo را به یک فایل شرح می‌دهد:

echo "this is a line" > file.txt

برای جلوگیری از رونویسی از فایل‌های موجود، گزینه "noclobber" را با استفاده از دستور set فعال کنید:

set -o noclobber
echo "this is a line" > file.txt
Output:
bash: file.txt: cannot overwrite existing file

عملگر |< به شما اجازه می‌دهد تا گزینه "noclobber" را بازنویسی نمایید:

set -o noclobber
echo "this is a line" >| file.txt

عملگر << به جای بازنویسی فایل، خروجی را به انتهای فایل اضافه می‌کند:

echo "this is a line" >> file.txt

 

این مطلب نیز ممکن است برای شما مفید باشد: آموزش مجوزهای فایل ها در لینوکس (chmod)

 

برای ایجاد یک خروجی مختلط، از دستور printf به صورت زیر استفاده نمایید:

printf "Hello, I'm %s.\n" $USER > file.txt

اگر می‌خواهید چندین خط در یک فایل بنویسید، بصورت زیر آن را به دستور cat ارسال کرده و سپس آن را در یک فایل بنویسید.

cat << EOF > file.txt
The current working directory is: $PWD
You are logged in as $(whoami)
EOF

به منظور افزودن خطوط به انتهای فایل، به جای استفاده از < قبل از نام فایل، از عملگر << استفاده کنید:

cat << EOF >> file.txt
The current working directory is: $PWD
You are logged in as $(whoami)
EOF

شما می‌توانید، خروجی هر دستوری را در یک فایل بنویسید:

date +"Year: %Y, Month: %m, Day: %d" > file.txt

به عنوان مثال، در دستور بالا، خروجی دستور date در فایل نوشته می‌شود.

 

این مطلب نیز ممکن است برای شما مفید باشد: دستور Ls در لینوکس (لیست کردن فایل ها و دایرکتوری ها)

 

نوشتن در فایل با استفاده از دستور tee

دستور tee از ورودی استاندارد می‌خواند و همزمان در خروجی استاندارد و یک یا چند فایل می‌نویسد.

echo "this is a line" | tee file.txt

رفتار پیش فرض دستور tee، همانند عملگر < یک فایل مشخص شده را بازنویسی می‌کند. به منظور افزودن خروجی به انتهای فایل باید دستور را با گزینه a (--append)- فراخوانی کنید:

echo "this is a line" | tee -a file.txt

اگر نمی‌خواهید از دستور tee برای نوشتن در خروجی استاندارد استفاده نمایید، می‌توانید آن را به صورت زیر به /dev/null ارسال کنید:

echo "this is a line" | tee file.txt >/dev/null

به منظور نوشتن متن در بیش از یک فایل، فایل‌ها را به عنوان آرگومان‌های دستور tee مشخص نمایید:

echo "this is a line" | tee file_1.txt file_2.txt file_3.txt

یکی دیگر از مزایای دستور tee این است که می‌توانید از آن به همراه sudo استفاده کرده و در فایل‌های متعلق به کاربران دیگر بنویسید. به منظور افزودن متن به انتهای فایلی که اجازه نوشتن در آن ندارید، به صورت زیر از sudo قبل از دستور tee استفاده کنید:

echo "this is a line" | sudo tee file.txt

با اجرای دستور بالا، خروجی دستور echo به عنوان ورودی به tee منتقل می‌شود که از مجوزهای sudo استفاده کرده و خروجی را در فایل می‌نویسد.

 

 

 

منبع:

linuxize