ज़िंदगी को आसान बनाने वाले Shell ट्रिक्स
(blog.hofstede.it)- अलग-अलग keyboard shortcuts और command combinations का उपयोग करके shell environment में काम की गति और दक्षता बढ़ाने के तरीके संक्षेप में दिए गए हैं
- CTRL + W, U, K, Y जैसे बेसिक shortcuts से line editing, CTRL + A/E, ALT + B/F से cursor movement, और reset से terminal recovery संभव है
- Bash और Zsh में CTRL + R से command history search, !!·!$·ESC+. से पिछले commands दोबारा इस्तेमाल, और Brace Expansion व Globstar से repetitive tasks को automate किया जा सकता है
- Process Substitution, tee, bg/disown जैसी advanced features से process control और log management को अधिक efficient बनाया जा सकता है
- shell को toolbox की तरह सहजता से इस्तेमाल करने पर productivity और focus दोनों बढ़ते हैं, और shortcuts को एक-एक करके आदत बनाना सबसे अहम है
लगभग सभी shell में काम करने वाले बेसिक shortcuts और features
-
CTRL + W, U, K, Yकंबिनेशन cursor के आधार पर शब्द या लाइन के आगे-पीछे के हिस्से को तेज़ी से delete या restore करने वाले line editing shortcuts हैं
CTRL + Wcursor से पहले का शब्द delete करता हैCTRL + Ucursor से लाइन की शुरुआत तक cut करता है, औरCTRL + Yसे उसे फिर paste किया जा सकता हैCTRL + Kcursor से लाइन के अंत तक cut करता है- CTRL + A / E लाइन की शुरुआत और अंत तक ले जाते हैं, ALT + B / F शब्द के आधार पर पीछे-आगे move करते हैं
- ज़्यादातर terminal में ये default रूप से enabled होते हैं, जबकि Mac पर इन्हें चलाने के लिए Option key को Meta के रूप में सेट करना पड़ता है
- reset या stty sane command, binary file गलती से output होने पर terminal के बिगड़ जाने की स्थिति में recovery के लिए उपयोगी हैं
- स्क्रीन बिगड़ी हुई हो तब भी input संभव होता है, इसलिए
resetटाइप करके Enter दबाने पर restore हो जाता है - CTRL + C / D क्रमशः command interrupt करने और EOF (file end) signal भेजने के लिए हैं
- खाली prompt पर
CTRL + Dदबाने से shell बंद हो जाता है - CTRL + L
clearcommand की तरह तुरंत स्क्रीन साफ़ करता है - अभी टाइप की जा रही command को बनाए रखते हुए prompt को स्क्रीन के ऊपरी हिस्से में ले जाता है
- cd - तुरंत पिछले directory में ले जाता है, और pushd / popd directory stack की मदद से कई locations के बीच काम करना आसान बनाते हैं
- > file.txt file को खाली करता है लेकिन delete नहीं करता, इसलिए permissions और ownership बरकरार रहते हैं
- $_ variable पिछली command का आख़िरी argument दोबारा इस्तेमाल करने देता है
- उदाहरण:
mkdir -p /path/newdir && cd "$_" - set -e, set -u script safety बढ़ाने वाले options हैं
set -eerror होने पर तुरंत exit कर देता हैset -uundefined variable को refer करने पर error देता हैset -euo pipefailका combination और भी मज़बूत protection देता है
Bash और Zsh में advanced shortcuts और features
- CTRL + R command history में reverse incremental search करता है
- keyword टाइप करते ही पुराने commands तुरंत मिल जाते हैं और दोबारा इस्तेमाल किए जा सकते हैं
- !! पिछली पूरी command को फिर से चलाता है
sudo !!से पिछली command को admin rights के साथ दोबारा चलाया जा सकता है
- CTRL + X, CTRL + E अभी टाइप की जा रही command को default editor (Vim, Nano आदि) में खोलते हैं, जहाँ उसे edit करके चलाया जा सकता है
- Zsh में इसके लिए अलग configuration की ज़रूरत होती है
- fc command पुरानी command को
$EDITORमें खोलकर edit करने का पारंपरिक तरीका है
- ESC + . या ALT + . पिछली command का आख़िरी argument cursor की जगह insert करते हैं
- बार-बार दबाने पर उससे भी पुरानी commands के arguments तक cycle किया जा सकता है
- !$ वही काम non-interactive तरीके से करता है
-
Brace Expansionदोहराव वाली typing कम करने की curly brace expansion feature है
cp pf.conf{,.bak}→cp pf.conf pf.conf.bakmv filename.{txt,md}→mv filename.txt filename.mdmkdir -p project/{src,tests,docs}से कई directories बनाई जा सकती हैं- Process Substitution
<(command)command output को file की तरह treat करता है - उदाहरण:
diff <(sort file1.txt) <(sort file2.txt)से temporary files के बिना comparison किया जा सकता है - Globstar(
**) subdirectories तक recursively files खोजने देता है - Bash में
shopt -s globstarसे enable करना पड़ता है, जबकि Zsh में यह default रूप से enabled होता है - उदाहरण:
ls **/*.jsसे सभी subfolders की JS files खोजी जा सकती हैं
-
CTRL + Z**,** bg**,** disown** का combination processes कोbackground में चलाने और shell से अलग करने के लिए है
CTRL + Zसे pause →bgसे background execution →disownसे shell से अलग- इससे SSH बंद होने के बाद भी process चलती रह सकती है
- command |& tee file.log standard output(stdout) और standard error(stderr) दोनों को एक साथ pipe के ज़रिए भेजता है
|&,2>&1 |का shorthand हैteeका उपयोग स्क्रीन पर output दिखाने और log save करने दोनों के लिए साथ में किया जा सकता है
shell के उपयोग पर मुख्य सलाह
- shell एक toolbox है, और इसे अच्छे से चलाना productivity को काफ़ी बढ़ा सकता है
- सभी shortcuts एक साथ सीखने की बजाय एक-एक करके आदत बनाना ज़्यादा प्रभावी है
- repetitive input और बेकार typing कम करके workflow को सरल बनाया जा सकता है
- आदत पड़ने पर terminal अब रुकावट नहीं बल्कि अपना workspace बन जाता है
3 टिप्पणियां
लगभग सब कुछ emacs key binding है, लेकिन emacs की बात लगभग आती ही नहीं। इसे आजकल टिप्स की तरह बहुत शेयर होते देख कर समय के बदलाव का एहसास होता है। readline लाइब्रेरी ने ही लगभग सभी emacs key binding को implement किया है। ऐसा लगता है कि IDE पर लगभग 20 साल पहले ही लगभग पूरी तरह शिफ्ट हो गया था, लेकिन gdbtui जैसी चीजें इस्तेमाल करने वाले एक fossil के नज़रिए से देखें तो अच्छा वही है जो कभी मरता नहीं।
Hacker News की टिप्पणियाँ
मुझे लगा कि मेरी ज़िंदगी बदल गई जब मैंने ऊपर वाले arrow key को remap किया
अब यह सभी कमांड्स में घूमने के बजाय, केवल उन कमांड्स को खोजता है जो पहले से टाइप किए गए अक्षरों से शुरू होती हैं
उदाहरण के लिए,
tar -टाइप करके ऊपर वाला arrow दबाने पर पहले इस्तेमाल किए गए tar options तुरंत दिख जाते हैंzsh में इसे इस तरह सेट करते हैं
.inputrcमें यह जोड़ें.inputrcमें भी यही चीज़ लागू की जा सकती हैटर्मिनल में vim-mode चालू कर दें तो काफी ज़्यादा आरामदायक हो जाता है
तीन शब्द पहले गलती हुई?
3bcwसे काम खत्मपूरी लाइन हटानी हो तो
cc, और जटिल बदलाव के लिएvसे सीधे (neo)vim में खोल सकते हैंअगर आप पहले से (neo)vim इस्तेमाल करते हैं, तो नए shortcuts याद नहीं रखने पड़ते, यही इसकी सबसे अच्छी बात है
ctrl-x+eसे neovim में खोलकर काम करना अच्छा समझौता हैset -o viटाइप करता हूँयह काफ़ी दिलचस्प लगा कि किसी ने
\#नाम की script को PATH में डालकर pipeline के कुछ हिस्सों को comment out करने लायक बना दिया~/bin/noglobफ़ाइल में इस तरह रखकर bash से zsh scripts चलाते समय noglob conflicts से बचता हूँmycmd1 #| mycmd2की तुलना में इसका क्या फायदा है, यह जानना चाहूँगा$PATHमें जोड़ने वाला हूँCTRL+W आम तौर पर पिछले whitespace तक delete करता है, इसलिए यह
/var/log/nginx/पूरा हटा देता हैAlt+Backspace non-alphabetic character तक delete करता है
लेकिन ध्यान रहे, यह browser tab बंद करने वाले shortcut से टकरा सकता है
$WORDCHARSsetting से/हटा दें तो मनचाहा behavior मिल जाता है (संदर्भ लिंक)history search को upgrade करने के लिए fzf shell integration की सिफारिश करता हूँ
demo video / official docs
एक trick है जो मैं अक्सर इस्तेमाल करता हूँ
जब लंबी command टाइप कर रहा होता हूँ और पहले कुछ और करना पड़ जाए, तो
Ctrl-Cसे cancel करने के बजाय उसे comment out करके run कर देता हूँ ताकि वह history में बनी रहे"push-line-or-edit"binding से किया जा सकता है, और bash मेंC-uके बादC-yसे मिलता-जुलता तरीका अपनाया जा सकता हैctrl-uसे मौजूदा लाइन को save करके खाली करना, फिरctrl-yसे वापस paste करना। zsh मेंalt-qसे यह प्रक्रिया अपने-आप हो सकती हैalt-shift-3से मौजूदा command के आगे#जोड़कर नई लाइन पर जाया जा सकता हैLLM-जैसा title पसंद नहीं आया, लेकिन कुछ tips काम की हैं इसलिए उन्हें आज़माने वाला हूँ
brace expansion का tab completion के साथ ठीक से काम न करना अफ़सोस की बात है। काश last token duplicate करना या file extension हटाना जैसी और सुविधाएँ होतीं
zsh config में मैं एक function इस्तेमाल करता हूँ जो कुछ commands को history से बाहर रखता है
उदाहरण के लिए,
--forceजैसी खतरनाक commands history में न रहेंzsh में global alias auto-expansion लागू करने वाला एक snippet इस्तेमाल करता हूँ
उदाहरण के लिए
alias -G G='rg -s'सेट करने पर,command | Gटाइप करते ही वह अपने-आपcommand | rg -sमें expand हो जाता हैspace दबाने पर अपने-आप expand होता है, और
\aliasकी तरह टाइप करने पर expansion छोड़ा जा सकता है.bashrcमें बनाई हुई एक “deep cd” function हैयह argument में दिए गए string को शामिल करने वाली पहली directory में अपने-आप चला जाता है
शुरू में लगा था यह धीमा होगा, लेकिन उम्मीद से ज़्यादा बार इस्तेमाल होने लगा
jc, z, fzf जैसे smart cd tools भी साथ में देखना अच्छा रहेगाऊपर वाले up arrow key remapping को Emacs users तो बस
c-rसे कर लेते हैं। tuning का आखिरकार best form stock ही है.