`>>` ব্যতীত ফাইলের শেষের জন্য লাইন সংযোজনের আরও কি সহজ উপায় আছে?


21

সম্প্রতি আমি একটি tree_holeফাইলের ছোট বাক্যগুলি প্রতিধ্বনি করছি ।

আমি echo 'something' >> tree_holeএই কাজটি করতে ব্যবহার করছিলাম ।

তবে আমি সবসময় চিন্তিত ছিলাম আমি যদি এর >পরিবর্তে ভুল ইনপুট >>রাখি তবে যেহেতু আমি প্রায়শই এটি করি।

তাই আমি বাশার্কে আমার নিজস্ব একটি গ্লোবাল বাশ ফানক তৈরি করেছি:

function th { echo "$1" >> /Users/zen1/zen/pythonstudy/tree_hole; }
export -f th

তবে আমি ভাবছি যে কোনও ফাইলের শেষে লাইন সংযোজন করার আরও একটি সহজ উপায় আছে কিনা। কারণ আমার অন্যান্য সময়ে এটি ব্যবহার করার প্রয়োজন হতে পারে।

কোন আছে?


9
আপনি ভুলে যাবেন না যে আপনি প্রতিবার প্রবেশ করবেন> একবার আমার একটি নাম ছিল rm="rm -i"এবং অন্য কোনও পরিবেশে rm *নিশ্চিতকরণের প্রশ্নের জন্য অপেক্ষা করছিল। আপনি বিপজ্জনক অভ্যাস শিখছেন!
ওয়াল্টার এ

9
@ ওয়াল্টারআর এর, তার "কার্যনির্বাহী" তাকে >> এর পরিবর্তে>> টাইপ করতে দেয় না, তিনি কেবল "কিছুটা_সংশ্লিষ্টতা" চালান, যা উপাধি অপরিবর্তিত থাকলে কিছুই করে না।
র্যান্ডম 832

1
@ রানম 832 তার কাজের জন্য সঠিক। সতর্কতাটি নোক্লোবারের মতো একটি "সমাধান" এর জন্য। যখন তিনি তার সাধারণ শেলটিতে নোক্লোবারের মতো কিছু ব্যবহার করেন তখন তিনি ব্যবহার করতে পারেন> যখন তিনি অস্থায়ী রুট হন এবং কিছু যুক্ত করতে চান।
ওয়াল্টার এ 14

7
@ র্যান্ডম 832 এবং ওয়াল্টারএ আমি যখন দেখি তখন আমি সাধারণত এ বিষয়ে কিছু বলি না, তবে আমি অনুভব করেছি যে বন্ধুত্বপূর্ণ নোটিশটি একবারে একবারে কার্যকর হতে পারে। জেনের ব্যবহারকারীর প্রোফাইলে খুব বেশি বিশদ নেই, তাই আপনি যদি সত্যই জানেন যে তার "কার্যনির্বাহী" সঠিক ফর্মটি রয়েছে তবে আমি নিশ্চিত নই । হতে পারে আপনার তাদের "workaround" বা OP এর "workaround" বলা উচিত । সম্ভবত আপনি জেনকে ব্যক্তিগতভাবে জানেন এবং আপনি তাই জানেন যে তাঁর সঠিক, তবে এই শব্দটি ক্ষমা করুন p বড় কথা নয়, আমি কেবল এটি উল্লেখ করেছি কারণ আমি জানি আপনি যদি আমার সম্পর্কে কথা বলতে এই ফর্মটি ব্যবহার করেন তবে আমি এটির খুব বেশি প্রশংসা করতে পারতাম না।
সেলেদা

1
@ জেন, আপনি লিখেছেন আপনি >> এর পরিবর্তে> ভুল ইনপুট করতে উদ্বিগ্ন। সেলাদের পরিকল্পনা আপনার পরিবেশের ঝুঁকিগুলি সরিয়ে ফেলবে এবং এটি আপনার জন্য একটি ভাল সমাধান। আপনি যখন আপনার প্রতিবেশীকে সহায়তা করছেন (যার নিকোলবার নেই বা তিনি ksh ব্যবহার করছেন) এবং আপনি দু'একটি> চরিত্রের জন্য মনোযোগ হারিয়ে ফেলেছেন, আপনি দুর্ঘটনাক্রমে তার কোনও ফাইল ওভাররাইট করতে পারেন। সুতরাং প্রতিবারই আপনি আপনার নিজের পরিবেশে নোক্লোবারের সতর্কতা পান, Godশ্বরকে বা সেলাদাকে ধন্যবাদ জানান, নিজেকে বলুন: ওহ, সাবধানে থাকুন, আপনার মাথা ঝাঁকুন এবং দুই সেকেন্ড অপেক্ষা করুন।
ওয়াল্টার এ

উত্তর:


47

শেলের noclobberবিকল্পটি সেট করুন :

bash-3.2$ set -o noclobber
bash-3.2$ echo hello >foo
bash-3.2$ echo hello >foo
bash: foo: cannot overwrite existing file
bash-3.2$ 

3
এটিই সুনিশ্চিত উত্তর। নোট করুন যে আপনি যদি জোর করে চাপিয়ে দেন তবে ফাইলটি ওভাররাইট করতে পারেন >|zshএই আচরণটি ডিফল্টরূপে সক্ষম করে।
orion

1
@ orion আপনি কীভাবে এটি zsh এ এন / অক্ষম করবেন? আমি এটিকে স্পষ্টভাবে অক্ষম করার কথা মনে করি না, তবে ওভাররাইটিং আমার zsh এর উপর কার্যকর কাজ করে।
মুড়ু

2
এটি setopt noclobberএবং setopt clobber। এটি প্রদর্শিত হয় এটি হুবহু "ডিফল্ট" নয়, এটি আপনার ডিস্ট্রো দিয়ে পাঠানো কনফিগারেশন ফাইলগুলির উপর নির্ভর করে।
অরিয়ান

@ মুরু যে set [+-]Cকোনও আধুনিক শেল
মাইকজার্ভ

3
@ জেন set +o noclobberবাশ, বা set +C
রুস্লান

7

আপনি চিন্তিত হয় আপনার ফাইল ক্ষতিগ্রস্ত হবে >আপনি সংযুক্ত আপনার ফাইল অ্যাট্রিবিউট পরিবর্তন করতে পারেন অপারেটর শুধুমাত্র:
ইন কোনো ext2 / ext3 / ext4 এই ফাইল সিস্টেম: chattr +a file.txt
ইন XFS দ্বারা ফাইলসিস্টেম:echo chattr +a | xfs_io file.txt

এবং যদি আপনি কোনও ফাংশন চান তবে আমি নিজের জন্য ইতিমধ্যে একটি ফাংশন তৈরি করেছি (আমি এটি সার্ভিস ফাইলে লগ ইন আউটপুটগুলির জন্য ব্যবহার করেছি), আপনি আপনার উদ্দেশ্যে এটি পরিবর্তন করতে পারেন:

# This function redirect logs to file or terminal or both!
#@ USAGE: log option data
# To the file     -f file
# To the terminal -t
function log(){
        read -r data       # Read data from pipe line

        [[ -z ${indata} ]] && return 1    # Return 1 if data is null

        # Log to /var/log/messages
        logger -i -t SOFTWARE ${data}

        # While loop for traveling on the arguments
        while [[ ! -z "$*" ]]; do
                case "$1" in
                        -t)
                                # Writting data to the terminal
                                printf "%s\n" "${data}"
                                ;;
                        -f) 
                                # Writting (appending) data to given log file address
                                fileadd=$2
                                printf "%s %s\n" "[$(date +"%D %T")] ${data}" >> ${fileadd}
                                ;;
                        *)
                                ;;
                esac
                shift           # Shifting arguments
        done
}

2
এই স্ক্রিপ্টটিতে কয়েকটি সমস্যা রয়েছে। 1) $গ্লোব্বিং, শব্দের বিভাজন এবং সম্পর্কিত হোয়াইটস্পেস সমস্যা রোধ করতে আপনার সাধারণত পরামিতি বিস্তারের চারপাশে ডাবল কোট লাগানো উচিত (স্টাফ যা একটি দিয়ে শুরু হয় )। অনলাইন শেলচেক অ্যাপ্লিকেশনটি এটি এবং ব্যাশ স্ক্রিপ্টগুলির বিভিন্ন অন্যান্য সমস্যাটি ধরতে পারে। একটি সম্পর্কিত নোট অন "$@"হয় অনেক চেয়ে নিরাপদ $*
পিএম 2 রিং

3
2) ইনপুটটিতে যে কোনও ব্যাকস্ল্যাশগুলি নিম্নলিখিত অক্ষর থেকে পালাতে না পারে সে জন্য আপনাকে সাধারণত readকমান্ডটি কল করতে হবে -r। ৩) স্ক্রিপ্ট ভেরিয়েবলের জন্য নিম্ন কেস ব্যবহার করা বাশ স্ক্রিপ্টগুলিতে স্বাভাবিক হয় যেহেতু সমস্ত UPPER CASE সিস্টেম ভেরিয়েবলের জন্য ব্যবহৃত হয়। সুতরাং আপনি যদি নিজের ভেরিয়েবলগুলির জন্য উচ্চতর কেস ব্যবহার করেন তবে আপনি আপনার কোডটি পড়ে এমন লোকদের বিভ্রান্ত করবেন এবং আপনি ঘটনাক্রমে কোনও স্ক্রিপ্ট পরিবর্তন করতে পারেন যা আপনি পরে স্ক্রিপ্টে ব্যবহার করতে চান। এবং যদি আপনি স্ক্রিপ্টটি উত্স করেন তবে এটি পরবর্তী কমান্ডগুলির জন্য ভেরিয়েবলগুলি ক্লোবার করবে।
পিএম 2 রিং 12'15

3
4) echoস্থির স্ট্রিং মুদ্রণের জন্য কার্যকর, তবে এটি বিশেষত জিএনইউ সিস্টেমে স্বেচ্ছাসেবী তথ্য সহ অপ্রত্যাশিত জিনিসগুলি করতে পারে। এটি ব্যবহার করা অনেক বেশি নিরাপদ printf। আরও তথ্যের জন্য, ইউনিক্স.স্ট্যাকেক্সেঞ্জার / প্রশ্ন / 65803/… দেখুন , বিশেষত স্টাফেন চেজেলাসের উত্তর's
পিএম 2 রিং 12'15

3
@ পিএম 2 রিং, আজ আমি আপনার কাছ থেকে অনেক কিছু শিখেছি, অনেক অনেক ধন্যবাদ .. আমি যত তাড়াতাড়ি সম্ভব এগুলি ঠিক করব।
সিপাহারাড সলুর

1
দুর্দান্ত কাজ, সিপাহারাদ!
প্রধানমন্ত্রী 2Ring

3

teeসংযোজন বিকল্পটি ব্যবহার করুন :

foo | tee -a some-file
# or
tee -a some-file <<EOF
blah blah
EOF
# or 
tee -a some-file <<<"blah blah"

5
ভাল ধারণা, +1, তবে আমি ধারণা করি যে ওপি যদি কোনও >চরিত্র ভুলে যাওয়ার বিষয়ে উদ্বিগ্ন থাকে তবে তারা -aবিকল্পটি ভুলে যাওয়ার বিষয়ে চিন্তিত হতে পারে !
সেলেদা

@ ক্যালাডা আমি মনে করি (তবে আমি অনুমান করতে পারি যে বারবার কীস্ট্রোকের সেটগুলিতে একটি কীস্ট্রোক অনুপস্থিত থেকে কোনও টাইপো অপশন ভুলে যাওয়ার চেয়ে বেশি হওয়ার সম্ভাবনা রয়েছে)।
মুড়ু

0

ওভাররাইট করার জন্য ফাইলগুলি খুলতে পারে এমন অনেক প্রোগ্রাম বিকল্পভাবে এ্যাপেন্ডের জন্য এগুলি খুলতে পারে, যেমন gnu dd।

dd conv=notrunc oflag=append of=file

এটি স্টাইটিন বা if= প্যারামিটারে যুক্ত একটি ফাইল 2>/dev/nullবাইট গণনা দমন করতে পারে।


3
উত্তর হিসাবে পোস্ট করার আগে আপনার কোডটি পরীক্ষা করা এটি একটি ভাল ধারণা
প্রধানমন্ত্রী 2 রিং

1
সুপারিশ ddকরা একটি খারাপ ধারণা। ddএর আউটপুটে নির্ভরযোগ্যভাবে তার ইনপুটটি লিখবে না, যখন তাদের মধ্যে একটিও নিয়মিত ফাইল বা ব্লক ডিভাইস নয়
গিলস 'খারাপ হওয়া বন্ধ করুন'

@ গিলিস, আপনি সেই লিঙ্কটিতে তথ্যটি ভুলভাবে উপস্থাপন করছেন, যখন গণনা নির্দিষ্ট করা হয়নি তখন ডিডি উপলব্ধ সমস্ত ডেটা কপি করবে, বিড়ালের মতোই does
জেসেন

-1

আমি একটি ব্যবহার করতে চাই sed(এমনকি ব্যাকআপ-অনুলিপি সহ - এক্সটেনশনটি দেখুন -i):

sed -i.bak '$ a\something' /Users/zen1/zen/pythonstudy/tree_hole

কেন আমি অবাক হচ্ছি না ... তুমি কস্টাসের মতো উম্মাদ! :) (এটি একটি প্রশংসা,
বিটিডাব্লু

@ পিএম 2 রিং হ্যাঁ, আমি খুব বিপজ্জনক! : পি
কস্টাস

অবশ্যই যেভাবে কাজ করে তা হ'ল ফাইলটির একটি অনুলিপি তৈরি করা, শেষ পর্যন্ত নতুন পাঠ্য যুক্ত করা, তারপরে মূল ফাইলটি মুছুন এবং অনুলিপিটির মূল নামটি পরিবর্তন করুন। ডিরেক্টরিটিতে লেখার অ্যাক্সেস না থাকলে এই (1) কাজ করে না, (২) লিঙ্কগুলি বিরতি দেয় এবং (3) ফাইল বড় হলে রিসোর্স-ব্যয়বহুল। মজার বিষয় যে আপনি "বিপজ্জনক" শব্দটি নিয়ে এসেছেন!
জি-ম্যান

-1

আপনি সর্বদা অন্য উপায়ে ফাইলটি সন্ধান করতে পারেন ...

seq 10000000 >f
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
wc -l f; tail f

... যে অদ্ভুত সন্ধানের ক্রম প্রিন্ট:

10000000
10000001
10000002
10000003
10000004
10000005 f
9999996
9999997
9999998
9999999
10000000
new line!
new line!
new line!
new line!
new line!

কিন্ত মূর্খ।

আরও কার্যকর উদাহরণ দেখতে পারে:

 apnd() if    shift
        then  wc -l  >&2
              printf "$@"
        fi    <>"$1" >&0

আপনি এটিকে কল করতে পারেন:

 apnd /path/to/file          \
      "${printf_fmt_string}" \
       arbitrary list of strings

এবং আপনি অ্যাডেন্ড ক্রিয়াটি সংঘটিত হওয়ার ঠিক আগে fileলেখা একটি গণনার লাইন দিয়ে শেষ করে ফেলবেন stderr

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