কেউ নিম্নলিখিত পদ্ধতিতে সমস্যাটি সমাধান করতে পারে:
cat file | some_sed_command | tee file >/dev/null
কোন ।
সম্ভাবনাগুলি file
ড্রপ কেটে যাবে তবে কোনও গ্যারান্টি নেই যে cat file | some_sed_command | tee file >/dev/null
তারা কেটে যাবে file
।
এটি প্রথমে কোন কমান্ডটি প্রথমে প্রসেস করা হয় তার উপর নির্ভর করে, কেউ যেমন প্রত্যাশা করতে পারে তার বিপরীতে, পাইপে কমান্ডগুলি বাম থেকে ডান প্রসেস হয় না । কোন গ্যারান্টি নেই কমান্ড প্রথম বাছাই করা হবে, যার সম্বন্ধে, তাই এক হিসাবে ভাল শুধু তা মনে হতে পারে এলোমেলোভাবে বাছাই করা এবং কখনো শেল আপত্তিকর এক অবচয় না উপর নির্ভর করে।
আপত্তিজনক কমান্ডের জন্য তিনটি কমান্ডের মধ্যে প্রথমে বাছাইয়ের সম্ভাবনা কম হওয়ার কারণে আপত্তিকর কমান্ডের জন্য দুটি কমান্ডের মধ্যে প্রথমে বাছাই হওয়ার সম্ভাবনা কম থাকে file
, তবে এটি কেটে ফেলা হবে এমন সম্ভাবনা কম , তবে এটি এখনও ঘটতে চলেছে ।
script.sh
:
#!/bin/bash
for ((i=0; i<100; i++)); do
cat >file <<-EOF
foo
bar
EOF
cat file |
sed 's/bar/baz/' |
tee file >/dev/null
[ -s file ] &&
echo 'Not truncated' ||
echo 'Truncated'
done |
sort |
uniq -c
rm file
% bash script.sh
93 Not truncated
7 Truncated
% bash script.sh
98 Not truncated
2 Truncated
% bash script.sh
100 Not truncated
সুতরাং কখনও কিছু ব্যবহার করবেন না cat file | some_sed_command | tee file >/dev/null
। sponge
অলির পরামর্শ মতো ব্যবহার করুন ।
বিকল্প হিসাবে, আরও শক্ত পরিবেশ এবং / অথবা তুলনামূলকভাবে ছোট ফাইলগুলির জন্য যে কোনও কমান্ড চালুর আগে ফাইলটি পড়তে এখানে স্ট্রিং এবং একটি কমান্ড বিকল্প ব্যবহার করতে পারে:
$ cat file
foo
bar
$ for ((i=0; i<100; i++)); do <<<"$(<file)" sed 's/bar/baz/' >file; done
$ cat file
foo
baz