سؤال
هل هناك أي اختلافات بين ":> ملف" و "> ملف"?
$ : > file.out
$ ls -l file.out
-rw-rw---- 1 user user 0 Mar 18 21:08 file.out
$ > file.out
$ ls -l file.out
-rw-rw---- 1 user user 0 Mar 18 21:08 file.out
المحلول
:
هل القذيفة المدمجة في عملية NO-OP أو NULL. لذا ، نعم ، ينتهي توجيهه إلى ملف بملف فارغ ، وكذلك توجيه أي شيء إلى ملف. أعتقد أن هناك شعورًا بأن مصدرك هو نوع مختلف من لا شيء ، لكن النتيجة هي نفسها. تبعا إلى دليل البرمجة النصية المتقدمة, ، ال "> file.out
"الصياغة لن تعمل على بعض الأنظمة.
لاحظ أنه في كلتا الحالتين (على عكس "اللمس") ، سيتم استبدال محتويات الملف دون أي شيء إذا كان الملف موجودًا بالفعل.
نصائح أخرى
استخدام : > file.out
أكثر محمولة لغير الباش. على سبيل المثال ، يحدد ZSH القالب الفارغ الافتراضي cat
, ، ليس :
(ما لم يكن في وضع المحاكاة). إذا انتهى بك الأمر إلى حاجة إلى جعل البرنامج النصي يعمل مع أ /bin/sh
وهو ليس باش (على سبيل المثال ، نظام *BSD ، أي نظام تشغيل مغلق المصدر ، أو حتى في بعض توزيعات GNU/Linux الآن ، حيث يتم استخدام DASH) ، ستجعل حياتك أسهل إذا كنت تستخدم : > file.out
وفقا ل Posix ، كلا العمل ولكن الإصدار مع :
يتم إحباط إذا فشل إعادة التوجيه في حين أن الإصدار مع إعادة التوجيه فقط يعيد فقط حالة خروج غير صفرية. في الحالة الأخيرة ، يكون الاستخدام أكثر قدرة على الاستخدام true
.
باش فقط هذا الحق في وضع posix.
الاسم المستعار أو الوظائف المسمى :
انتهاك قيود posix على التطبيق وليست محمولة.
الفرق الوحيد الذي يمكنني التفكير فيه هو أنه يمكنك إعادة تعريف :
عبر الاسم المستعار أو تعريفات الوظيفة. على سبيل المثال ، قد ترغب في اقتطاع الملفات معظم الوقت (باستخدام السلوك الافتراضي لا شيء :
) ، لكن ملفات إجبار على أن يكون لها رأس قياسي في بعض الحالات. الاستمارة > file
لا يمكن إعادة تعريفها.
علي سبيل المثال:
#! /bin/bash
test -n "$ADD_COPYRIGHT" &&
:() { echo "# Copyright (c) 2010 MyName"; echo; }
# Truncate the file to zero size, unless ADD_COPYRIGHT is set, in which case
# the file is truncated to contain only a copyright notice.
: > file
# Add content to the file
some_command >> file