আমি যা সংগ্রহ করছি তা থেকে, আপনি যখন ব্যবহার করছেন তখন তা পরীক্ষা করতে চান
tee -- "$OUT_FILE"
(নোট করুন --
বা এটি দিয়ে ফাইল নামগুলির জন্য কাজ করবে না - - দিয়ে tee
লেখার জন্য ফাইলটি খুলতে সফল হবে ) ।
তা হ'ল:
- ফাইল পাথের দৈর্ঘ্য PATH_MAX সীমা অতিক্রম করবে না
- ফাইলটি বিদ্যমান (সিমিলিং রেজোলিউশনের পরে) এবং এটি টাইপ ডিরেক্টরি নয় এবং আপনার এতে লেখার অনুমতি রয়েছে।
- যদি ফাইলটি বিদ্যমান না থাকে তবে ফাইলটির ডাইরনাম একটি ডিরেক্টরি হিসাবে উপস্থিত রয়েছে (সিমলিংক রেজোলিউশনের পরে) এবং এতে আপনার লেখার এবং অনুসন্ধানের অনুমতি রয়েছে এবং ফাইলটির নামের দৈর্ঘ্য ডিরেক্টরিতে থাকা ফাইল সিস্টেমের NAME_MAX সীমা অতিক্রম করে না।
- বা ফাইলটি এমন একটি সিমিলিংক যা কোনও ফাইলকে নির্দেশ করে যা উপস্থিত নেই এবং এটি কোনও সিএমিলিং লুপ নয় তবে কেবল উপরের মানদণ্ডগুলি পূরণ করে
ভিফ্যাট, এনটিএফএস বা এইচএফএসপ্লাসের মতো ফাইল সিস্টেমগুলির জন্য আমরা এখন অবহেলা করব যা বাইট মান ফাইলের নামগুলির মধ্যে সীমাবদ্ধতা রয়েছে, ডিস্ক কোটা, প্রক্রিয়া সীমা, সেলিনাক্স, অ্যাপারমোর বা অন্যান্য সুরক্ষা ব্যবস্থা, পুরো ফাইল সিস্টেম, কোনও ইনোড বাম, ডিভাইস যে ফাইলগুলি যে কারণে বা অন্য কোনও কারণে খোলা যায় না, এক্সিকিউটেবল এমন ফাইলগুলি বর্তমানে কিছু প্রক্রিয়া ঠিকানার জায়গাতে ম্যাপ করা থাকে যার সবগুলি ফাইল খোলার বা তৈরি করার ক্ষমতাকেও প্রভাবিত করতে পারে।
সহ zsh
:
zmodload zsh/system
tee_would_likely_succeed() {
local file=$1 ERRNO=0 LC_ALL=C
if [ -d "$file" ]; then
return 1 # directory
elif [ -w "$file" ]; then
return 0 # writable non-directory
elif [ -e "$file" ]; then
return 1 # exists, non-writable
elif [ "$errnos[ERRNO]" != ENOENT ]; then
return 1 # only ENOENT error can be recovered
else
local dir=$file:P:h base=$file:t
[ -d "$dir" ] && # directory
[ -w "$dir" ] && # writable
[ -x "$dir" ] && # and searchable
(($#base <= $(getconf -- NAME_MAX "$dir")))
return
fi
}
ইন bash
বা কোনো বোর্ন মত শেল, শুধু প্রতিস্থাপন
zmodload zsh/system
tee_would_likely_succeed() {
<zsh-code>
}
সঙ্গে:
tee_would_likely_succeed() {
zsh -s -- "$@" << 'EOF'
zmodload zsh/system
<zsh-code>
EOF
}
এখানে সম্পর্কিত zsh
বৈশিষ্ট্যগুলি হ'ল $ERRNO
(যা সর্বশেষ সিস্টেমের কলের ত্রুটি কোডটি প্রকাশ করে) এবং $errnos[]
সংশ্লিষ্ট স্ট্যান্ডার্ড সি ম্যাক্রো নামগুলিতে অনুবাদ করতে এসোসিয়েটিভ অ্যারে। এবং $var:h
(সিএসএস থেকে) এবং$var:P
(চাহিদা zsh 5.3 অথবা উপরে)।
বাশ এখনও সমতুল্য বৈশিষ্ট্য নেই।
$file:h
dir=$(dirname -- "$file"; echo .); dir=${dir%??}
GNU বা এর সাথে প্রতিস্থাপন করা যেতে পারে dirname
:IFS= read -rd '' dir < <(dirname -z -- "$file")
।
জন্য $errnos[ERRNO] == ENOENT
, একটি পদ্ধতির চালানো হতে পারেls -Ld
ফাইলটিতে এবং ত্রুটি বার্তাটি ENOENT ত্রুটির সাথে মিলেছে কিনা তা পরীক্ষা করা যায়। নির্ভরযোগ্যভাবে এবং বহনযোগ্যভাবে এটি করা কঠিন।
একটি পদ্ধতির হতে পারে:
msg_for_ENOENT=$(LC_ALL=C ls -d -- '/no such file' 2>&1)
msg_for_ENOENT=${msg_for_ENOENT##*:}
(ধরে নিলাম যে ত্রুটির বার্তাটি অনুবাদ দিয়ে শেষ হয় এবং সেই অনুবাদটিতে একটি অন্তর্ভুক্ত নেই ) এবং তার পরিবর্তে , করুন:syserror()
ENOENT
:
[ -e "$file" ]
err=$(ls -Ld -- "$file" 2>&1)
এবং এর সাথে একটি ENOENT ত্রুটি পরীক্ষা করুন
case $err in
(*:"$msg_for_ENOENT") ...
esac
$file:P
অংশ trickiest মধ্যে অর্জন করা হল bash
বিশেষত FreeBSD 'র উপর।
ফ্রিবিএসডি-র একটি realpath
কমান্ড এবং একটি readlink
কমান্ড রয়েছে যা একটি -f
বিকল্প গ্রহণ করে , তবে ফাইলগুলি এমন একটি সিমিলিংক রয়েছে যা সমাধান করে না এমন ক্ষেত্রে সেগুলি ব্যবহার করা যাবে না। যে সঙ্গে একই perl
'র Cwd::realpath()
।
python
এর মতো os.path.realpath()
একইরকম কাজ করতে দেখা zsh
$file:P
যাচ্ছে, সুতরাং ধরে নিই যে কমপক্ষে একটি সংস্করণ python
ইনস্টল করা আছে এবং একটি python
আদেশ রয়েছে যা তাদের মধ্যে একটির (যা ফ্রিবিএসডি তে প্রদত্ত নয়) আপনি করতে পারেন:
dir=$(python -c '
import os, sys
print(os.path.realpath(sys.argv[1]) + ".")' "$dir") || return
dir=${dir%.}
তবে তারপরে, আপনি পাশাপাশি পুরো জিনিসটি করতে পারেন python
।
অথবা আপনি সিদ্ধান্ত নিতে পারেন যে এই সমস্ত কোণার কেসগুলি পরিচালনা করবেন না।