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 ના અંતે ઉમેરીને |
| < file | File માંથી input લે છે |
| cmd1 | cmd2 | Pipe: 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 filesFormula
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 માં શું હશે?
- બંને લીટીઓ: first અને second
- ફક્ત 'second', કારણ કે એકલો > દર વખતે file ઉપર લખી નાખે છે
- ફક્ત 'first', કારણ કે file પહેલેથી બની ચૂકી હતી
- કશું નહીં; > એ 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 ને ખવડાવવું, $(...) એટલે પરિણામ મૂકવું.