سؤال كيف أصدّر $ something >> file.txt بدون الرجوع؟


عندما echo $something >> file.txt، سيتم إلحاق خط جديد إلى الملف.

ماذا لو كنت أرغب في الإلحاق دون خط جديد؟


70
2018-03-01 08:25


الأصل


كن حذرا echo $something، سلوكها يعتمد على IFS متغير ، ويمكن أن ينتهي بك الأمر مع اختفاء الشخصية. يمكنك تجربة ما يلي: var="hello world"; echo $var (فضاءان بين مرحبا والعالم) أو var="hello world"; IFS='l'; echo $var أو var="-e hello \\n world"; echo $var. لحل ذلك ، ضع علامات اقتباس مزدوجة حول المتغير كما يلي: echo "$var"، او استعمل printf. - jfg956


الأجوبة:


وهذا ما echo -n هو ل .


83
2018-03-01 08:28



هل هناك ما يعادل cat؟ (على سبيل المثال ، عندما يكون لديك ملف something.txt بدلا من متغير $something) - cboettig
cboettig: لا. استخدم أداة مختلفة لطباعة كل شيء باستثناء السطر الجديد النهائي. - Ignacio Vazquez-Abrams
@ cboettig ، لا تضيف cat أي شيء إلى الإخراج بشكل افتراضي ، لذلك ليس هناك حاجة لمظلة '-n' لقط. على سبيل المثال ، إذا لم يكن الملف الخاص بك يحتوي على نهاية سطر في السطر الأخير ، فستتم طباعة المطالبة shell بعد الحرف الأخير من الملف وليس في سطر جديد - Rondo


printf مرنة جدا و محمولة أكثر من echo. مثل تطبيقات C / Perl / etc ، إذا لم تقم بإنهاء سلسلة التنسيق باستخدام \n ثم لا يتم طباعة سطر جديد:

printf "%s" "$something" >> file.txt

36
2018-03-01 14:42





إذا كنت تستخدم إخراج الأمر ، يمكنك استخدام xargs في تركيبة مع echo

/sbin/ip route|awk '/default/ { print $3 }' | xargs echo -n >> /etc/hosts

6
2017-12-14 07:52





tr هو بديل آخر.

إذا كنت تستخدم echo كمدخلك يمكنك الابتعاد tr -d '\n'.

تعمل هذه التقنية أيضًا عند توجيه الإخراج من أوامر أخرى (مع خط إخراج واحد فقط). علاوة على ذلك ، إذا كنت لا تعرف ما إذا كانت الملفات لها نهايات خط UNIX أو DOS يمكنك استخدامها tr -d '\n\r'.

فيما يلي بعض الاختبارات التي توضح أن هذا يعمل.

يتضمن Newline:

something='0123456789' ; echo ${something} | wc -c
11

خط يونكس الجديد:

something='0123456789' ; echo ${something} | tr -d '\n\r' | wc -c
10

نمط DOS:

something='0123456789' ; echo ${something} | unix2dos | tr -d '\n\r' | wc -c
10

اختبار مع BSD tr وجنو tr.


0
2018-05-11 11:41