72 पॉइंट द्वारा GN⁺ 2026-03-27 | 3 टिप्पणियां | WhatsApp पर शेयर करें
  • अलग-अलग 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 ExpansionGlobstar से 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 + W cursor से पहले का शब्द delete करता है
    • CTRL + U cursor से लाइन की शुरुआत तक cut करता है, और CTRL + Y से उसे फिर paste किया जा सकता है
    • CTRL + K cursor से लाइन के अंत तक 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 clear command की तरह तुरंत स्क्रीन साफ़ करता है
    • अभी टाइप की जा रही 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 -e error होने पर तुरंत exit कर देता है
    • set -u undefined 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.bak
    • mv filename.{txt,md}mv filename.txt filename.md
    • mkdir -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 टिप्पणियां

 
phoon 2026-03-30

लगभग सब कुछ emacs key binding है, लेकिन emacs की बात लगभग आती ही नहीं। इसे आजकल टिप्स की तरह बहुत शेयर होते देख कर समय के बदलाव का एहसास होता है। readline लाइब्रेरी ने ही लगभग सभी emacs key binding को implement किया है। ऐसा लगता है कि IDE पर लगभग 20 साल पहले ही लगभग पूरी तरह शिफ्ट हो गया था, लेकिन gdbtui जैसी चीजें इस्तेमाल करने वाले एक fossil के नज़रिए से देखें तो अच्छा वही है जो कभी मरता नहीं।

 
GN⁺ 2026-03-27
Hacker News की टिप्पणियाँ
  • मुझे लगा कि मेरी ज़िंदगी बदल गई जब मैंने ऊपर वाले arrow key को remap किया
    अब यह सभी कमांड्स में घूमने के बजाय, केवल उन कमांड्स को खोजता है जो पहले से टाइप किए गए अक्षरों से शुरू होती हैं
    उदाहरण के लिए, tar - टाइप करके ऊपर वाला arrow दबाने पर पहले इस्तेमाल किए गए tar options तुरंत दिख जाते हैं
    zsh में इसे इस तरह सेट करते हैं

    bindkey "^[OA" up-line-or-beginning-search # Up  
    bindkey "^[OB" down-line-or-beginning-search # Down
    
    • एक बार CTRL+r इस्तेमाल करना शुरू कर दें, तो फिर ऊपर वाला arrow कभी इस्तेमाल नहीं करेंगे
    • मेरे हिसाब से यह पूरी तरह game changer है। bash में ऐसा ही behavior पाने के लिए .inputrc में यह जोड़ें
      "\e[A":history-search-backward  
      "\e[B":history-search-forward
      
    • fish shell में यह default behavior है। टाइप किए गए शब्द के आधार पर ऊपर/नीचे arrow से कमांड्स खोजी जा सकती हैं, और alt+ऊपर/नीचे से सिर्फ arguments भी खोजे जा सकते हैं
    • .inputrc में भी यही चीज़ लागू की जा सकती है
    • मैं ऊपर/नीचे arrow वैसे ही रहने देता हूँ, और इसकी जगह ctrl+p और ctrl+n को इस तरीके से सेट करता हूँ
  • टर्मिनल में vim-mode चालू कर दें तो काफी ज़्यादा आरामदायक हो जाता है
    तीन शब्द पहले गलती हुई? 3bcw से काम खत्म
    पूरी लाइन हटानी हो तो cc, और जटिल बदलाव के लिए v से सीधे (neo)vim में खोल सकते हैं
    अगर आप पहले से (neo)vim इस्तेमाल करते हैं, तो नए shortcuts याद नहीं रखने पड़ते, यही इसकी सबसे अच्छी बात है

    • मुझे पुराने Emacs manual की एक पंक्ति याद आ गई। जटिल commands की बजाय मैं mouse settings सुझाना चाहूँगा
    • मैं 20 साल से ज़्यादा समय से (n)vim इस्तेमाल कर रहा हूँ, लेकिन shell का vi-mode पसंद नहीं है। जब जटिल commands चाहिए हों, तो ctrl-x+e से neovim में खोलकर काम करना अच्छा समझौता है
    • मैं भी vim बहुत इस्तेमाल करता हूँ, लेकिन shell में नहीं। उसकी जगह Emacs style shortcuts (ctrl-a, ctrl-e आदि) पूरे macOS में इस्तेमाल करता हूँ। मुझे लगता है vim को insert mode में emacs bindings सपोर्ट करने चाहिए
    • “readline vi-mode” नाम का feature पहली बार पता चला। इसे और देखना पड़ेगा
    • समझ नहीं आता कि emacs mode default क्यों है। नया shell खोलते ही सबसे पहले set -o vi टाइप करता हूँ
  • यह काफ़ी दिलचस्प लगा कि किसी ने \# नाम की script को PATH में डालकर pipeline के कुछ हिस्सों को comment out करने लायक बना दिया

    #!/bin/sh
    cat
    
    • मैं भी ऐसा ही एक trick इस्तेमाल करता हूँ। ~/bin/noglob फ़ाइल में
      #!/bin/sh
      $*
      
      इस तरह रखकर bash से zsh scripts चलाते समय noglob conflicts से बचता हूँ
    • मैं parentheses comments इस्तेमाल करता हूँ। script documentation के लिए अच्छे हैं, लेकिन interactive shell में झंझट वाले। फिर भी creative commenting style होने की वजह से मज़ेदार है
    • mycmd1 #| mycmd2 की तुलना में इसका क्या फायदा है, यह जानना चाहूँगा
    • यह सच में काम की चीज़ है, इसे मैं अपने $PATH में जोड़ने वाला हूँ
  • CTRL+W आम तौर पर पिछले whitespace तक delete करता है, इसलिए यह /var/log/nginx/ पूरा हटा देता है
    Alt+Backspace non-alphabetic character तक delete करता है
    लेकिन ध्यान रहे, यह browser tab बंद करने वाले shortcut से टकरा सकता है

    • Firefox v147 से shortcut override करने की सुविधा जुड़ गई है। संबंधित लिंक
    • macOS में GUI shortcuts और terminal shortcuts अलग-अलग होते हैं, इसलिए ऐसी समस्या नहीं होती। ⌘C, ⌘W आदि terminal में भी वैसे ही काम करते हैं
    • मेरे environment (fish + Alacritty) में इसका उल्टा behavior है। फिर भी Ctrl-Shift-T से बंद किया हुआ tab वापस ला सकते हैं, इसलिए ठीक है
    • $WORDCHARS setting से / हटा दें तो मनचाहा behavior मिल जाता है (संदर्भ लिंक)
    • Ctrl-Shift-T से tab तुरंत restore किया जा सकता है
  • history search को upgrade करने के लिए fzf shell integration की सिफारिश करता हूँ
    demo video / official docs

  • एक trick है जो मैं अक्सर इस्तेमाल करता हूँ
    जब लंबी command टाइप कर रहा होता हूँ और पहले कुछ और करना पड़ जाए, तो Ctrl-C से cancel करने के बजाय उसे comment out करके run कर देता हूँ ताकि वह history में बनी रहे

    $ long_command  
    $ #long_command  
    $ stuff_1  
    $ stuff_2  
    $ #long_command  
    $ long_command
    
    • zsh में यह "push-line-or-edit" binding से किया जा सकता है, और bash में C-u के बाद C-y से मिलता-जुलता तरीका अपनाया जा सकता है
    • इससे भी आसान तरीका है ctrl-u से मौजूदा लाइन को save करके खाली करना, फिर ctrl-y से वापस paste करना। zsh में alt-q से यह प्रक्रिया अपने-आप हो सकती है
    • bash में alt-shift-3 से मौजूदा command के आगे # जोड़कर नई लाइन पर जाया जा सकता है
  • LLM-जैसा title पसंद नहीं आया, लेकिन कुछ tips काम की हैं इसलिए उन्हें आज़माने वाला हूँ
    brace expansion का tab completion के साथ ठीक से काम न करना अफ़सोस की बात है। काश last token duplicate करना या file extension हटाना जैसी और सुविधाएँ होतीं

    • लेखन शैली में भी LLM जैसा अहसास आता है। जैसे “The shell is a toolbox, not an obstacle course.” जैसी पंक्तियाँ
    • PowerShell में भी readline mode है, इसलिए WSL के साथ इस्तेमाल करते समय switching का बोझ कम हो जाता है
    • readline, bash का हिस्सा जैसा काम करता है, इसलिए ऐसे tips को shell features कहना मुझे ठीक लगता है
  • zsh config में मैं एक function इस्तेमाल करता हूँ जो कुछ commands को history से बाहर रखता है
    उदाहरण के लिए, --force जैसी खतरनाक commands history में न रहें

    function zshaddhistory() {
      emulate -L zsh
      if ! [[ "$1" =~ "(^ |--force|whatever)" ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
      else
        return 1
      fi
    }
    
    • मैं भी मिलते-जुलते तरीके से, record न की जाने वाली commands के लिए आगे space जोड़ने वाला alias बनाकर रखता हूँ
      unhist () { alias $1=" $1"; }
      unhist unhist
      unhist fzf
      unhist rghist
      
  • 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 में अपने-आप चला जाता है

    dcd() {
      [ -z "$1" ] && return
      local dir
      dir=$(find . -type d -path "*$1*" -print -quit 2>/dev/null)
      [ -n "$dir" ] && cd "$dir"
    }
    

    शुरू में लगा था यह धीमा होगा, लेकिन उम्मीद से ज़्यादा बार इस्तेमाल होने लगा

    • autojump का jc, z, fzf जैसे smart cd tools भी साथ में देखना अच्छा रहेगा
 
phoon 2026-03-30

ऊपर वाले up arrow key remapping को Emacs users तो बस c-r से कर लेते हैं। tuning का आखिरकार best form stock ही है.