Shell Metacharacters and Operators: Filename Expansion (wildcards *, ?, []), Input/Output Redirection (>, >>, <), Pipes (|), Command Substitution ($(...))

Shell અમુક અક્ષરોને ખાસ રીતે લે છે: તારાચિહ્ન ગમે તે files નાં નામ માટે ઊભું રહે છે, મોટાનું ચિહ્ન પરિણામને file માં મોકલે છે, pipe એક command ને બીજામાં ખવડાવે છે, અને dollar સાથેના કૌંસ command નું પરિણામ સીધું તમારી લીટીમાં મૂકી દે છે.

12 min read · 7 cards · 2 checks

Read in: English · हिन्दी · ગુજરાતી


Theory

મહાશક્તિ ધરાવતા અક્ષરો

કેટલાક અક્ષરોનો shell માટે ખાસ અર્થ થાય છે. તમે * ટાઇપ કરો ત્યારે shell શબ્દશઃ 'તારો' નામની file શોધતું નથી, પણ એને files નાં નામ સાથે મેળવવા માટે ફેલાવે છે. તમે > ટાઇપ કરો ત્યારે તમે મોટાનું ચિહ્ન છાપતા નથી, પણ પરિણામને file માં વાળી રહ્યા છો.

આવા ખાસ અક્ષરોને metacharacters (અને operators) કહે છે, અને એ સાદા commands ને શક્તિશાળી એક લીટીની આજ્ઞાઓમાં ફેરવી નાખે છે. આ પાઠ એમાંના પાયાના અક્ષરો આવરી લે છે: wildcards, redirection, pipes અને command substitution. આ બધા પર પકડ આવે એટલે command line ની ક્ષમતા ધરખમ રીતે વધી જાય છે.

At a glance

ચિહ્નઅર્થ
*Wildcard: files નાં નામમાં ગમે તેટલા અક્ષરો સાથે મેળ ખાય છે
?Wildcard: બરાબર એક અક્ષર સાથે મેળ ખાય છે
> fileપરિણામને file માં વાળે છે (એની ઉપર લખી નાખે છે)
>> fileપરિણામને વાળે છે, પણ file ના અંતે ઉમેરીને
< fileFile માંથી input લે છે
cmd1 | cmd2Pipe: cmd1 નું પરિણામ cmd2 નું input બને છે
$(cmd)Command substitution: એની જગ્યાએ cmd નું પરિણામ મુકાય છે

Practical

Metacharacters કામ કરતાં (ચકાસાયેલું)

$ ls *.txt              # wildcard: every name ending in .txt
a1.txt  a2.txt  out.txt
$ ls ?1.*              # ? = one char: names like a1.xxx, b1.xxx
a1.txt  b1.log

$ echo "line1" > out.txt    # > creates/overwrites out.txt
$ echo "line2" >> out.txt   # >> appends a second line
$ wc -l < out.txt           # < feeds the file in as input
2

$ echo "There are $(ls *.txt | wc -l) txt files"   # pipe + substitution
There are 3 txt files

Formula

Redirection files તરફ જાય છે; pipes commands તરફ

બે વિચારો અલગ રાખો. Redirection એ command ને file સાથે જોડે છે: > અને >> પરિણામને file માં મોકલે છે, જ્યારે < file માંથી input વાંચે છે. Pipe | એ command ને બીજા command સાથે જોડે છે: એ પહેલાનું પરિણામ સીધું બીજામાં ખવડાવે છે, અને વચ્ચે કોઈ file હોતી નથી.

એટલે sort names.txt > sorted.txt ગોઠવેલું પરિણામ file માં મૂકે છે, જ્યારે sort names.txt | uniq ગોઠવેલું પરિણામ uniq માં ખવડાવે છે. એક બાજુ files, બીજી બાજુ commands: આ ભેદ સમજાય એટલે મોટા ભાગની ગૂંચ ઊકલી જાય છે.

Quiz

તમે ચલાવો છો: echo "first" > log.txt , અને પછીથી echo "second" > log.txt (બંનેમાં એક જ >). log.txt માં શું હશે?

  1. બંને લીટીઓ: first અને second
  2. ફક્ત 'second', કારણ કે એકલો > દર વખતે file ઉપર લખી નાખે છે
  3. ફક્ત 'first', કારણ કે file પહેલેથી બની ચૂકી હતી
  4. કશું નહીં; > એ file ને ભૂંસી નાખે છે
Show the answer

ફક્ત 'second', કારણ કે એકલો > દર વખતે file ઉપર લખી નાખે છે

એકલો > દર વખતે file ની અંદરના લખાણ ઉપર લખી નાખે છે. પહેલો command log.txt માં 'first' મૂકે છે; બીજો command એની આખી ઉપર 'second' લખી નાખે છે, એટલે ફક્ત 'second' બચે છે. વિકલ્પ A ત્યારે જ સાચો હોત જો બીજા redirect માં >> (અંતે ઉમેરવું) વપરાયું હોત, જે ભૂંસ્યા વગર ઉમેરે છે, અને એ જ નિર્ણાયક ભેદ છે. વિકલ્પ C ઊલટો છે: નવું લખાણ જૂનાની જગ્યાએ આવે છે, એનાથી ઊલટું નહીં. વિકલ્પ D ખોટો છે: > નવું લખાણ લખે છે (અને જરૂર પડે તો file બનાવે પણ છે); અહીં એ file ને ખાલી છોડતું નથી. યાદ રાખવા જેવી જાળ: > ઉપર લખી નાખે છે (અને જો તમારો ઇરાદો ઉમેરવાનો હોય તો data ગુમાવાય), જ્યારે >> અંતે ઉમેરે છે. હયાત લખાણ સાચવવા બાબતે શંકા હોય ત્યારે >> વાપરો.

Think first

> અને >> ને ગૂંચવવા એ આટલી જોખમી ભૂલ કેમ છે?

બંને file માં લખે છે. તો પછી અનુભવી વપરાશકારો એકલા > ને આટલી સાવધાનીથી કેમ વાપરે છે? વિચારીને પછી tap કરો.

Show the answer

કારણ કે એકલો > એ file માં જે કંઈ પહેલેથી હોય એને ચૂપચાપ નાશ કરી નાખે છે, અને એમાં કોઈ ચેતવણી કે પાછું વાળવાની સગવડ હોતી નથી. ધારો કે તમારી પાસે એક log ની file છે જેમાં અઠવાડિયાંઓથી અગત્યનાં પરિણામો ભેગાં થતાં આવ્યાં છે, અને તમારો ઇરાદો એમાં એક વધુ લીટી ઉમેરવાનો છે. જો તમે command >> log.txt ટાઇપ કરો તો તમે અંતે ઉમેરો છો, અને જૂનાં બધાં પરિણામો સલામત રહે છે. પણ જો હાથ લપસી જાય અને તમે એકલા > સાથે command > log.txt ટાઇપ કરી બેસો, તો shell પહેલાં file ને ખાલી કરી નાખે છે અને પછી નવું લખાણ લખે છે, એટલે અઠવાડિયાંઓનાં પરિણામો ક્ષણવારમાં ગાયબ, અને એમને પાછાં મેળવવા કોઈ કચરાપેટી પણ નથી (rm નો પાઠ યાદ કરો: Linux નાશ કરનારી ક્રિયાઓને હળવી કરતું નથી). જોખમ એ છે કે આ બે operators લગભગ સરખા દેખાય છે, ફક્ત એક અક્ષરનો ફેર, છતાં એક સાચવે છે અને બીજો ભૂંસી નાખે છે. એટલા માટે જ સાવધ વપરાશકારો એવી ટેવ પાડે છે કે અગત્યની file તરફ > ટાઇપ કરતી વખતે એક ક્ષણ થોભે, અને બદલવાને બદલે ઉમેરવાનો ઇરાદો હોય ત્યારે મૂળભૂત રીતે >> જ વાપરે. તાજું પરિણામ બનાવવા માટે એકલો > ઉત્તમ છે, પણ તમને વહાલી હોય એવી file તરફ તાકેલો હોય ત્યારે એ ભરેલી બંદૂક જેવો છે. એક વધારાનો > એટલે 'જે છે એ રહેવા દે'; એને ભૂલી જવું એટલે 'બધું ભૂંસી નાખ'.

Summary

Key takeaways

  • Metacharacters એટલે shell જેમને ખાસ રીતે લે છે એવા અક્ષરો, જે સાદા commands ને શક્તિશાળી એક લીટીની આજ્ઞાઓ બનાવે છે.
  • Wildcards files નાં નામ ફેલાવે છે: * ગમે તેટલા અક્ષરો સાથે મેળવે છે, ? બરાબર એક સાથે, અને [ ] અક્ષરોના સમૂહ સાથે.
  • Redirection command ને file સાથે જોડે છે: > ઉપર લખી નાખે છે, >> અંતે ઉમેરે છે, અને < file માંથી input વાંચે છે.
  • Pipe | એ command ને બીજા command સાથે જોડે છે, અને વચ્ચે કોઈ file વગર પરિણામ સીધું ખવડાવે છે.
  • Command substitution $(cmd) ની જગ્યાએ એ command નું પરિણામ મુકાય છે, અને એ સીધું તમારી લીટીમાં આવી જાય છે.
  • જોખમ: એકલો > ઉપર લખી નાખે છે (અને હયાત લખાણનો નાશ કરે છે) જ્યારે >> અંતે ઉમેરે છે; ઉમેરવું હોય ત્યારે મૂળભૂત રીતે >> વાપરો.
  • યાદ રાખવાની કડી: * એટલે ઘણા, ? એટલે એક, > એટલે ઉપર લખવું, >> એટલે ઉમેરવું, | એટલે command ને ખવડાવવું, $(...) એટલે પરિણામ મૂકવું.

Study this properly

This page is the lesson to read. In Gri-Learn the same topic is a graded deck: the self-checks are scored and your weak topics are tracked. Free to start.

Start this topic

Already have an account? Sign in

More from Shell Scripting in Linux

Gri-Learn · syllabus-mapped B.C.A. lessons in English, Hindi and Gujarati

Shell Metacharacters and Operators: Filename Expansion (wildcards *, ?, []), Input/Output Redirection (>, >>, <), Pipes (|), Command Substitution ($(...)) · Linux Operating System (LOS) (Minor-04) · Gri-Learn