শেল - একটি ফাইলে ভেরিয়েবল সামগ্রী লিখুন


98

আমি একটি ভেরিয়েবলের বিষয়বস্তু (এখানে বলা হয় var) একটি ফাইলে অনুলিপি করতে চাই ।

ফাইলটির নাম অন্য ভেরিয়েবলে সংরক্ষণ করা হয় destfile

এটি করতে আমার সমস্যা হচ্ছে। এখানে আমি চেষ্টা করেছি:

cp $var $destfile

আমি ডিডি কমান্ড দিয়েও একই জিনিসটি চেষ্টা করেছি ... অবশ্যই শেলটি ভেবেছিল যে $varকোনও ডিরেক্টরিকে নির্দেশ করছে এবং তাই আমাকে বলেছিল যে ডিরেক্টরিটি পাওয়া যায়নি।

আমি কিভাবে এই কাছাকাছি পেতে পারি?


4
দয়া করে কিছু সঠিকভাবে ফর্ম্যাটেড কোড পোস্ট করে যা আপনার ভেরিয়েবলগুলি এবং কীভাবে সমস্ত প্রাসঙ্গিক ত্রুটি বার্তাগুলি প্রদর্শিত হবে ঠিক সেভাবে পোস্ট করে আপনার প্রশ্নের উন্নতি করুন ।
টড এ জ্যাকবস

4
ডিরেক্টরিতে "ভেরিয়েবলের বিষয়বস্তু অনুলিপি" বলতে কী বোঝ? না $varএকটি ফাইলের নাম বা কিছু লেখা যে একটি ফাইলে লিখতে হবে উল্লেখ? যদি এটি পাঠ্য নির্দিষ্ট করে, তবে আপনি যে ফাইলটিতে এই লিখিত লেখাটি লিখতে চান তার নাম কী?
jahroy

var এর মধ্যে এমন পাঠ্য রয়েছে যা আমি অনুলিপি করতে চাইছি এবং যে ফাইলটিতে এটি লিখতে হবে সেটি ব্যবহারকারী-সংজ্ঞায়িত তাই এই কারণে যে আমি প্রথম স্থানে একটি ভেরিয়েবল ব্যবহার করছি।
ব্যবহারকারী 1546083

4
সম্ভবত $destdirনামকরণ করা উচিত $destfileযাতে এটি বিভ্রান্তিকর না হয় ... নামটি $destdirপরামর্শ দেয় এটি ফাইলের পরিবর্তে কোনও ডিরেক্টরি নির্দিষ্ট করে। এটি আপনার পুরো প্রশ্নটি সোজাসাপ্টা এবং বুঝতে সহজ করে তুলবে।
jahroy

উত্তর:


149

echoকমান্ডটি ব্যবহার করুন :

var="text to append";
destdir=/some/directory/path/filename

if [ -f "$destdir" ]
then 
    echo "$var" > "$destdir"
fi

ifপরীক্ষার যে $destdirএকটি ফাইল প্রতিনিধিত্ব করে।

>ফাইল ছিন্ন পর আপনার স্বাক্ষরে। আপনি যদি কেবল $varবিদ্যমান বিদ্যমান সামগ্রীতে পাঠ্য যুক্ত করতে চান তবে >>পরিবর্তে ব্যবহার করুন:

echo "$var" >> "$destdir"

cpকমান্ড একটি ফাইলে টেক্সট লেখার জন্য নয় (ফাইলগুলিতে) ফাইল কপি জন্য ব্যবহার করা হয়।


4
আরও কোটগুলির প্রয়োজন - এখনই, ভেরিয়েবলের মানের মধ্যে থাকা সাদা জায়গার কোনও রান একক জায়গায় রূপান্তরিত হবে, গ্লোব এক্সপ্রেশনগুলি প্রসারিত হবে ইত্যাদি
চার্লস ডফি

4
অন্য একটি জিনিস - আপনার সমাপ্তি উদ্ধৃতি এবং ]ইন এর মধ্যে একটি স্থান প্রয়োজন "$destdir"]
চার্লস ডাফি

4
echoআপনার পরিবর্তনশীলটিতে একটি পেছনের নতুন লাইন যুক্ত করে।
বেন দিল্টস

6
এই যদি ব্যর্থ হয় $varহয় -e text to append, এবং does't আসলে লিখতে-e
এরিক

4
echo $varআপনার পরিবর্তনশীল প্রসারিত করতে শেলের উপর নির্ভর করে কারণ এটি সাদা স্থান এবং বিশেষ অক্ষরের মতো জিনিসগুলির সাথে খুব বেশি ইচ্ছা করে কাজ করে না। perl -e 'print($ENV{var})'পরিবর্তে আপনি ব্যবহার করতে পারেন , এবং এটি ভেরিয়েবলের মানটি আউটপুট করবে।
ব্লেক মিশেল

41

echoসমস্যা আছে যে যদি varএর মতো কিছু থাকে তবে -eএটি একটি পতাকা হিসাবে ব্যাখ্যা করা হবে। অন্য বিকল্পটি হ'ল printfতবে printf "$var" > "$destdir"ভেরিয়েবলের কোনও পালানো অক্ষর প্রসারিত হবে, সুতরাং ভেরিয়েবলটিতে ব্যাকস্ল্যাশ থাকলে ফাইলের বিষয়বস্তু মেলে না। তবে, যেহেতু printfকেবলমাত্র ফর্ম্যাট স্ট্রিংয়ে ব্যাকস্ল্যাশগুলি পলায়ন হিসাবে ব্যাখ্যা করা হয়েছে, আপনি %sগন্তব্য ফাইলে সঠিক পরিবর্তনশীল বিষয়বস্তু সংরক্ষণ করতে বিন্যাস নির্দিষ্টকরণকারকটি ব্যবহার করতে পারেন :

printf "%s" "$var" > "$destdir"


4
ট্রিপল উদ্ধৃতি বা হেরডোকের মতো আপনার যদি ভেরিয়েবল স্ট্রিংয়ে নতুন লাইন থাকে তবে প্রিন্টফও ভাল। প্রতিধ্বনি নিউলাইনগুলি ভালভাবে পরিচালনা করে না।
বিফ্লাবিল

@ বিফ্লোবিল আপনি কীভাবে "প্রতিধ্বনি নিউলাইনগুলি হ্যান্ডেল করে না" ব্যাখ্যা করতে পারেন। কেবলমাত্র আমি দেখেছি ইকো একটি নতুন লাইন যুক্ত করেছে। যা echo "$var" > destfileভুল করে।
সেন্সরসমিত

@ সেন্সরস্মিথ আমার পরীক্ষাগুলিতে আমি দেখতে পাচ্ছি যে যখন স্ট্রিংটিতে "that n" থাকবে তখন প্রতিধ্বনি একটি নিউলাইন অক্ষর মুদ্রণ করবে। তবে, যদি স্ট্রিংটিতে একটি আসল নিউলাইন চরিত্র থাকে যা প্রতিধ্বনিত করে না। কেন জানি না।
বিফ্লাবিল

4
মূলত একটি বহনযোগ্যতা (এবং নির্ভরযোগ্যতা) ইস্যু। unix.stackexchange.com/a/65819… বা আমাদের মধ্যে মারাত্মক জন্য: printfআরও ভাল, এগিয়ে যান।
user3342816

30

আপনার পরিবর্তনশীল যদি উপরের উত্তরগুলির কোনওটিই কাজ করে না:

  • সঙ্গে সঙ্গে শুরু হয় -e
  • সঙ্গে সঙ্গে শুরু হয় -n
  • সঙ্গে সঙ্গে শুরু হয় -E
  • একটি রয়েছে \একটি দ্বারা অনুসরণn
  • এর পরে অতিরিক্ত নিউলাইন যুক্ত করা উচিত নয়

এবং তাই তাদেরকে নির্বিচারে স্ট্রিং সামগ্রীর জন্য নির্ভর করা যায় না।

ব্যাশে আপনি "এখানে স্ট্রিংস" ব্যবহার করতে পারেন:

cat <<< "$var" > "$destdir"

নীচের মন্তব্যে যেমন উল্লেখ করা হয়েছে, @ ট্রেবাওয়ার উত্তর (আমার হিসাবে একই ঘরে তৈরি!) ব্যবহার printfকরা আরও ভাল একটি পদ্ধতির।


4
আমি যা বলতে পারি তা থেকে, বিড়াল সর্বদা ফাইলের শেষে একটি নতুন লাইন সন্নিবেশ করায়, ভেরিয়েবলের শেষে নতুন লাইন না থাকুক (যদিও এটি বেশিরভাগ ক্ষেত্রে তর্কাতীতভাবে একটি ভাল জিনিস)। Printf ব্যবহার করে উত্তর একটি trailing সম্পর্কে newline ঢোকাতে এড়াতে বলে মনে হয়।
অ্যাশ

@Ash আরেকটি সুবিধা printfধরে catযে সাবেক শেল builtin যা সবসময় একটি বহিস্থিত বাইনারি তুলনায় দ্রুততর চালানো হবে না।
Géza Török

7

যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি $varকোনও ফাইলে অনুলিপি করতে চান (যদি এটি স্ট্রিং থাকে)।

echo $var > $destdir

এই তার কাজ হল কিভাবে. cpকমান্ডটি ব্যবহার করা শেলটিকে প্রথম যুক্তিটিকে কোনও ফাইল বা ডিরেক্টরির নাম হিসাবে ব্যাখ্যা করবে।
jahroy

4
আপনি যদি $varউদ্ধৃতিগুলিতে আবদ্ধ না হন তবে কিছু ক্ষেত্রে of var এর সামগ্রীর সাথে ফাইলের সামগ্রী 100% সমান নয়। উদাহরণস্বরূপ, যখন আরএসএ কীগুলি সহ "প্রতিধ্বনিত" ভারগুলি, আপনি ফাইলটিতে অবৈধ কী পান।
শ্রীগি

6
$varস্পেস থাকলে বা ব্যর্থ হয়-e
এরিক

1

আপনি যখন "কোনও ভেরিয়েবলের বিষয়বস্তুগুলি অনুলিপি করুন" বলবেন, তখন সেই ভেরিয়েবলটিতে কোনও ফাইলের নাম থাকে, বা এতে কোনও ফাইলের নাম থাকে?

আমি আপনার প্রশ্নটি ধরে নিচ্ছি যাতে আপনি ফাইলটিতে অনুলিপি করতে চান $varএমন সামগ্রী রয়েছে :

$ echo "$var" > "$destdir"

এটি $ ডাস্টডির নামে একটি ফাইলের মধ্যে into var এর মান প্রতিধ্বনিত করবে। উদ্ধৃতি দ্রষ্টব্য। "$ Var" উদ্ধৃতিতে আবদ্ধ হওয়া খুব গুরুত্বপূর্ণ। "$ দাদ্দির" এর জন্য যদি নামে কোনও স্থান থাকে। এটি যুক্ত করতে:

$ echo "$var" >> "$destdir"

4
যদি varথাকে তবে ব্যর্থ হয়-e
এরিক

4
echo তার বিকল্প তালিকাটি শেষ করতে প্রথম যুক্তি হিসাবে একটি ডাবল হাইফেন পাস করা , এভাবে @ এরিক দ্বারা উত্থাপিত সমস্যাটি সমাধান করে:echo -- "$var" >> "$destfile"
Géza

1

উপরের সমস্তটি কাজ করে তবে একটি সমস্যা (পলায়ন এবং বিশেষ অক্ষর) প্রায়শই কাজ করতে হবে যা প্রথমে ঘটতে হবে না: শেল দ্বারা পরিবর্তনশীল প্রসারিত হওয়ার পরে বিশেষ অক্ষর। প্রথম স্থানে কেবল এটি (পরিবর্তনশীল সম্প্রসারণ) করবেন না। পরিবর্তন না করে সরাসরি পরিবর্তনশীলটি ব্যবহার করুন।

এছাড়াও, যদি আপনার ভেরিয়েবলটিতে কোনও গোপন থাকে এবং আপনি সেই গোপনীয়তাকে একটি ফাইলে অনুলিপি করতে চান তবে শেল কমান্ডগুলির ট্রেসিং / কমান্ড প্রতিধ্বনি গোপনীয়তা প্রকাশ করতে পারে বলে আপনি কমান্ড লাইনে সম্প্রসারণ না করতে চান। মানে, সমস্ত উত্তর যা ব্যবহার করে$var কমান্ড লাইনে শেলটি ট্রেসিং এবং লগিংয়ে চলক বিষয়বস্তু প্রকাশ করে সম্ভাব্য সুরক্ষা ঝুঁকিপূর্ণ হতে পারে।

এটা ব্যবহার কর:

printenv var >file

তার অর্থ, ওপি প্রশ্নের ক্ষেত্রে:

printenv var >"$destfile"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.