বাশ: কেবলমাত্র পঠনযোগ্য রুট পার্টিশনে <<< "AR পরিবর্তনশীল" ব্যবহার করার সময় কিছু সমস্যা। কোন পরিচিত workaround?


11

ঠিক কাকতালীয়ভাবে আমাকে আমার এটিএ-আইডি-থেকে-ডিভাইস-নাম স্ক্রিপ্টটি ব্যবহার করতে হয়েছিল (এখানে পাওয়া যায়: /server/244944/linux-ata-erferences-translating-to-a-device-name/ 426561 # 426561 ) কেবল পঠনযোগ্য / পার্টিশনে। আপনি যদি কৌতূহলী হন তবে এটি একটি উবুন্টু পুনরুদ্ধার কনসোল যা আপনাকে আপনার /পার্টিশনটি অ্যাক্সেস করতে দেবে , তবে এটি কেবলমাত্র ডিফল্টরূপে পঠনযোগ্য হিসাবে মাউন্ট করবে। আমি এতে সন্তুষ্ট, কারণ অন্যথায় আমি সম্ভবত কখনই জানতে পারি না যে আমার স্ক্রিপ্ট একটি নির্দিষ্ট লাইনের কারণে একটি আর / ও সিস্টেমে অদ্ভুত আচরণ করে:

IFS=: read HostMain HostMid HostSub <<< "$HostFull"

লেখার অনুমতি না থাকলে এটি কাজ করে না । যদিও আমি অনুমান করি না যে এটি ব্যর্থ হবে, যদিও। কিন্তু দৃশ্যত <<<অপারেটর নেই কোথাও কিছু সাময়িক ফাইলটি লিখতে প্রয়োজন।

তবে কোনও অস্থায়ী ফাইল তৈরির ক্ষেত্রে বাধা দেওয়ার কোনও উপায় আছে বা ফাইলটি যেখানে লিখিত আছে তা নির্দিষ্ট করার কোনও উপায় আছে কি? উবুন্টু রিকভারি কনসোলে, --- অদ্ভুতভাবে যথেষ্ট --- /runডিরেক্টরিতে অনুমতি লেখার সুযোগ রয়েছে, তাই যদি আমি কোনওভাবে readটেম্প ফাইলটি স্বাভাবিকের চেয়ে অন্য কোথাও লিখতে "বলতে" পারতাম ।


2
@gniourf_gniourf না, "একটি ফাইল বর্ণনাকারী খোলার" কোনও সমস্যা হবে না (কেন হবে?) এবং এর /dev/fdসাথে কিছুই করার নেই। <<<যদিও এটি অপরাধী, কারণ এটি একটি অস্থায়ী ফাইল তৈরি করে (যা কোথাও লিখতে হবে)।
গিলস 'দু: খিত হওয়া বন্ধ করুন'

উত্তর:


8

একটি অ্যারে একটি অস্থায়ী ফাইলের প্রয়োজন ছাড়াই স্ট্রিংকে পার্সিং করতে পারে। গ্লোব্বিং বন্ধ করতে ভুলবেন না

set -f
IFS=: Hosts=($HostFull)
HostMain=${Hosts[0]}
HostMid=${Hosts[1]}
HostSub=${Hosts[2]}
set +f

2
বা এমনকি ছাড়া IFS, যদি আপনি নিশ্চিত সেখানে কোন শূন্যস্থান হয় $HostFullতাই হিসাবে: Hosts=( ${HostFull//:/ } )। এমনকি শূন্যস্থান থাকলেও: HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*}(বা অনুরূপ কিছু, আমি বিভ্রান্ত হচ্ছি :D)।
gniourf_gniourf

আপনি ঠিক বলেছেন, আপনি প্যারামিটারের
প্রসারকে

4

আমি @gniourf_gniourf এর সাথে একমত, আপনার সম্ভবত লেখার অ্যাক্সেসের প্রয়োজন তবে ফাইল বর্ণনাকারীর কাছে নয়, সম্ভবত কোনও ফাইল।

কেবলমাত্র পাঠ্য পার্টিশনে থাকাকালীন আপনার কমান্ডের প্রয়োগটি সনাক্ত করে আপনি এটি পরীক্ষা করতে পারেন।

{ strace -p "$$" & sleep 1; read var1 <<< "hi"; sleep 1; kill "$1"; }

straceউপরেরটি বাশ শেল (প্রক্রিয়া $$) এ চলবে । এরপরে এটি 1 সেকেন্ডের জন্য ঘুমায় এবং তারপরে readএখানে থেকে STRING চালায় । আমি "hi"এই পজিশনে স্ট্রিং রেখেছি । আমি তখন sleepআরো এক দ্বিতীয় এবং তারপর জন্য ।killstrace

উদাহরণ

এই আউটপুটটি বিশ্লেষণ করার সময় আপনি খেয়াল করবেন যে কোনও ফাইলটি খোলার পরে এটি কোনও ফাইলকে O_WRONLYলেখার জন্য।

open("/tmp/sh-thd-4137571604", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600) = 3

উপরে আমরা দেখতে পাচ্ছি আপনার কমান্ড সিকোয়েন্স দ্বারা কোন ফাইলটি লিখিত হচ্ছে।


1
"ফাইল বর্ণনাকারী তৈরি করা" নয় (এটি কোনও অর্থ দেয় না)। ফাইল তৈরি করতে । এটি readলেখার জন্য কোনও ফাইল খোলে না (এটি নির্বোধ হবে), এটি <<<
গিলস 'দু: খিত হওয়া বন্ধ করুন'

@ গিলস - ধন্যবাদ, আমি কী বলছি তা আমি যথেষ্ট বুঝতে পারি নি। এ।
স্ল্যাম

আপনাকে অনেক ধন্যবাদ! একটি খুব সুন্দর কৌশল, যা ভবিষ্যতে একই ধরণের সমস্যার সাথে আমার একাধিকবার সহায়তা করতে পারে। যাইহোক, এক জিনিস হয় আমাকে উদ্বেজক, এবং যে সত্য যে /tmpএকটি হল হার্ডকোডেড পথ। এবং সম্ভবত আপনি এটা অনুমিত করেছি, /tmp IS ইতিমধ্যেই কিন্তু শুধুমাত্র পাঠযোগ্য পাশাপাশি! এবং যেহেতু সেই পুনরুদ্ধার কনসোলটিতে কাজ করার ফলে আমার লাইভ ফাইল সিস্টেমে লগইন হয়ে যাবে, তাই আমি সেখানে সিমলিংক বা যা কিছু (এমনকি এই কনসোলে থাকাকালীন নয়) গণ্ডগোল করতে চাই না।
সিনট্যাক্সেরর

3

আমি এই জাতীয় কাজের জন্য অবস্থানগত পরামিতিগুলি খুব দরকারী। এটি সাধারণত সমস্ত শেলের কাছেও বহনযোগ্য এবং এগুলির জন্য কাঁটাচামচ বা অস্থায়ী ফাইলগুলি ব্যয় হয় না।

$ HostFull=main:mid:sub    
$ oldIFS=$IFS; IFS=:; set -- $HostFull; IFS=$oldIFS
$ echo $1
main
$ echo $2
mid
$ echo $3
sub

একটি ভাল পদ্ধতির! ধন্যবাদ. এছাড়াও, আমি এটি পছন্দ করি যে এটির জন্য কোনও বাহ্যিক সরঞ্জামের প্রয়োজন হয় না (যে আমরা সাধারণত কোনওভাবেই এই সীমিত পরিবেশে খুঁজে পাওয়ার আশা করি না)। শুধু পারে কিছু কষ্ট হতে হয় $1, $2, $3কাপড়: মনে রাখবেন যে একটি স্ক্রিপ্ট, এই সাধারণত একটি আর্গুমেন্ট স্ক্রিপ্ট প্রেরণ জন্য দাঁড়ানো হবে নিজেই । - এবং যখন আমরা এটিতে এসেছি: যদি আইএফএস বলতে একটি স্থান বোঝায়, * আইএফএস = * এই বাক্য গঠনতে না করবে; আপনাকে স্পষ্টভাবে আইএফএস = '' নির্দিষ্ট করতে হবে ।
সিনট্যাক্সেরর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.