24 पॉइंट द्वारा GN⁺ 2025-10-23 | 2 टिप्पणियां | WhatsApp पर शेयर करें
  • 10 साल से अधिक समय तक dotfiles को मेंटेन करते हुए लिखे गए कई shell scripts में से सबसे ज़्यादा इस्तेमाल होने वाले स्क्रिप्ट्स का परिचय
  • इन्हें clipboard·file management·internet·text processing·REPL launcher·date/time·AV·process·quick reference·system·grab bag जैसी श्रेणियों में बाँटा गया है, और हर स्क्रिप्ट को छोटे wrapper रूप में व्यावहारिक उदाहरणों के साथ दिखाया गया है
  • ज़्यादातर स्क्रिप्ट्स macOS और Linux पर काम करते हैं, और मुख्य दर्शन यह है कि “पहले से मौजूद tools की झंझट भरी छोटी-मोटी जटिलताओं को समतल करना
    • pbcopy/xclip, python3 -m http.server, yt-dlp, ffmpeg, mpv जैसे standard utilities का एकीकरण
  • सबसे अधिक उपयोग होने वालों में copy/pasta/pastas/cpwd, mkcd/tempe/trash/mksh, serveit/getsong/getpod/getsubs, scratch/straightquote/markdownquote, timer/boop/tunes आदि शामिल हैं

अपने dotfiles को मेंटेन करते हुए बनाए गए सबसे ज़्यादा इस्तेमाल होने वाले स्क्रिप्ट्स का परिचय

  • 10 साल से अधिक समय तक personal dotfiles को मैनेज करते हुए बनाए गए अलग-अलग shell scripts में से, अक्सर उपयोग किए जाने वाले स्क्रिप्ट्स को क्षेत्रवार व्यवस्थित किया गया है
  • हर स्क्रिप्ट के साथ उसका उद्देश्य, उपयोग की आवृत्ति, और प्रतिनिधि उदाहरण दिए गए हैं, जिससे तुरंत लागू करने की उपयोगिता बढ़ती है
  • साझा लक्ष्य हैं दोहराए जाने वाले कामों को छोटा करना, platforms के बीच abstraction, और सुरक्षा·पठनीयता में सुधार

clipboard से जुड़े scripts

  • copy और pasta: system clipboard manager को wrap करने वाले wrappers, जो macOS के pbcopy या Linux के xclip पर आधारित हैं
    • copy: output को clipboard में कॉपी करता है
    • pasta: clipboard से text लेकर output देता है
    • उदाहरण: run_some_command | copy, pasta > file.txt, vim "$(pasta)", pasta | base64 --decode
  • pastas: clipboard की स्थिति बदलते ही नया content real time में output करने वाला tool
    • कॉपी किए गए सभी links को file में सेव करने या कई links को एक साथ डाउनलोड करने में उपयोगी
    • उदाहरण: pastas > everything_i_copied.txt, pastas | wget -i -
  • cpwd: मौजूदा directory path को clipboard में कॉपी करता है
    • कई terminal tabs के बीच directories बदलते समय सुविधाजनक

file management scripts

  • mkcd foo: directory बनाकर तुरंत उसमें जाना (mkdir foo && cd foo का शॉर्टकट)
  • tempe: अस्थायी directory में जाना (cd "$(mktemp -d)"), sandbox environment में temporary काम करते समय बाद में सफाई की ज़रूरत नहीं
    • उदाहरण:
      # Download a file and extract it  
      tempe  
      wget 'https://example.com/big_file.tar.xz'  
      tar -xf big_file.tar.xz  
      # ...do something with the file...  
      
      # Write a quick throwaway script to try something out  
      tempe  
      vim foo.py  
      python3 foo.py  
      
  • trash: files को trash में भेजता है (macOS/Linux support), साधारण rm की तुलना में गलती से deletion रोकने के लिए
  • mksh: नया shell script file बनाता है, उसे executable सेट करता है, और तुरंत editor में खोलता है

internet से जुड़े scripts

  • serveit: local directory से static file server चलाता है (default port 8000, Python न हो तो fallback)
  • getsong yt-dlp से सबसे अच्छी audio quality में download करता है
  • getpod video को podcast के लिए audio के रूप में लेने वाला wrapper है
  • getsubs official subtitles को प्राथमिकता देता है और fallback के रूप में auto subtitles इस्तेमाल करके अंग्रेज़ी subtitles निकालता है। यह summary pipeline और backup उपयोग के लिए उपयुक्त है
  • wifi off/on/toggle: system WiFi control, network issues troubleshoot करते समय उपयोगी
  • url: URL string को parse करके protocol, hostname, path, query, hash आदि अलग-अलग निकालता है

text processing scripts

  • line 10: standard input से किसी खास line को output करता है (head, tail जैसा)
  • scratch: $EDITOR $(mktemp) की तरह Vim में अस्थायी text buffer जल्दी खोलने के लिए, one-off notes या छोटे transformation कामों के लिए उपयुक्त
  • straightquote: smart quotes को सामान्य straight quotes में बदलता है, code में quote समस्याओं को रोकता है और file size कम करता है
  • markdownquote: हर line के आगे > लगाकर Markdown blockquote बनाता है
  • length: input string की लंबाई लौटाता है (wc -c का विकल्प)
  • jsonformat: JSON data को सुन्दर format में output करता है
  • uppered/lowered: string को uppercase/lowercase में बदलता है
  • nato bar: input string को NATO alphabet code में बदलता है (Bravo Alfa Romeo आदि)
  • u+ 2025: Unicode character का नाम और symbol दिखाता है
  • snippets foo: personal snippet dictionary से किसी खास short phrase को लाता है
    • snippet arrow तीर देता है, snippet recruiter “not interested” जैसे template messages देता है

REPL launcher से जुड़े scripts

  • Ruby के irb से प्रेरित होकर अलग-अलग भाषाओं के REPL जल्दी चलाना:
    • iclj: Clojure
    • ijs: Deno (न हो तो Node)
    • iphp: PHP
    • ipy: Python
    • isql: SQLite (Bash में memory mode)

date और time scripts

  • hoy: मौजूदा तारीख ISO format में output करता है (उदाहरण: 2020-04-20), file name आदि के prefix के रूप में उपयोगी
  • timer 10m: time timer (जैसे 10 मिनट), पूरा होने पर sound और OS notification भेजता है
  • rn: date और cal का उपयोग करके वर्तमान समय और मासिक calendar को पढ़ने में आसान रूप में दिखाता है

audio, video, image processing

  • ocr: macOS पर image files से text extraction (आगे विस्तार की योजना)
  • boop: पिछला command सफल/असफल होने के आधार पर sound notification देता है (जैसे tests चलाने के बाद सहज उपयोग)
  • sfx: खास sound effect file (.ogg) चलाता है, boop, timer के साथ जुड़ता है
  • tunes: mpv से audio files चलाता है (shuffle support सहित)
  • pix: mpv से photos देखता है
  • radio: पसंदीदा internet radio stations का quick launcher
  • speak: stdin से पढ़े गए text से Markdown हटाकर speech synthesis (TTS) करता है
  • shrinkvid: ffmpeg से video file compress करता है
  • removeexif: JPEG से EXIF data हटाता है, आगे कई formats support करने की योजना
  • tuivid: terminal के भीतर video देखना, व्यावहारिक उपयोग कम लेकिन दिलचस्प feature

process management

  • each: xargs, find ... -exec का विकल्प, complex commands चलाना आसान बनाता है
  • running foo: दिए गए keyword से चल रहे processes (PID, command आदि) खोजकर पढ़ने योग्य रूप में output करता है
  • murder: kill का wrapper, धीरे-धीरे नरम signals से शुरू करके ज़रूरत पड़ने पर forceful termination तक जाता है। program बंद करने के अनुरोध में गलती रोकने के लिए
  • waitfor $PID: दिए गए PID के समाप्त होने तक प्रतीक्षा करता है, सिस्टम को जागृत अवस्था में रखता है
  • bb my_command: command को वास्तव में background mode में चलाता है, daemon आदि के लिए उपयुक्त
  • prettypath: $PATH को line breaks के साथ एक नज़र में पढ़ने योग्य रूप में output करता है (debugging में उपयोगी)
  • tryna my_command/trynafail my_command: command सफल होने तक बार-बार चलाना (run until success), या असफल होने तक चलाना (run until fail); network सहित कई automation कामों में उपयोगी

quick reference tools

  • emoji: keyword से emoji खोजता और output करता है
  • httpstatus: सभी HTTP status codes की सूची output करता है, किसी खास code का विवरण भी देख सकता है
  • alphabet: अंग्रेज़ी alphabet के lowercase·uppercase पूरे output करता है (उम्मीद से ज़्यादा उपयोगी)

system management

  • theme 0/theme 1: पूरे system का theme (dark/light) बदलता है, Vim, Tmux आदि से भी जुड़ता है
  • sleepybear: system को sleep mode में डालता है (macOS, Linux)
  • ds-destroy: .DS_Store files को recursive ढंग से हटाता है, macOS user folders साफ़ करने में उपयोगी

अन्य

  • catbin foo: PATH में मौजूद file का source code तुरंत दिखाता है
  • notify: OS स्तर की notification भेजता है, लंबे काम पूरे होने पर तुरंत सूचित करने के लिए
  • uuid: version 4 UUID बनाता है

निष्कर्ष

  • इस लेख में बताए गए scripts वे tools हैं जिन्हें लेखक वास्तव में अक्सर उपयोग करता है
  • खुद बनाए गए shortcut command scripts काम की दक्षता बढ़ाने, गलतियों को रोकने, और productivity सुधारने में बहुत प्रभावी हैं
  • आपको भी अपने automation scripts बनाकर इस्तेमाल करने की सलाह दी जाती है

2 टिप्पणियां

 
GN⁺ 2025-10-23
Hacker News राय
  • trash a.txt b.png कमांड a.txt और b.png फ़ाइलों को ट्रैश में भेजती है, और Mac व Linux पर सपोर्टेड है। मैं पहले जो तरीका इस्तेमाल करता था, उसमें हर फ़ाइल को क्रम से प्रोसेस किया जाता था, इसलिए हर फ़ाइल पर delete की आवाज़ आती थी और Finder के ⌘Z से सिर्फ़ आख़िरी फ़ाइल ही restore की जा सकती थी। इसे बेहतर बनाया जा सकता है, लेकिन सच कहें तो macOS में बिल्ट-इन आधिकारिक trash कमांड इस्तेमाल करना ज़्यादा सुविधाजनक है। मैं Finder इस्तेमाल नहीं करता, इसलिए आवाज़ या ⌘Z restore नहीं मिलता, लेकिन यह तेज़ है और “Put Back” फीचर भी काम करता है। और JSON pretty-print के लिए node की जगह jq इस्तेमाल करें तो कोड बहुत छोटा हो जाता है, और आजकल macOS में jq पहले से इंस्टॉल आता है। UUID प्रिंट करने के लिए भी यही बात है—अगर v4 UUID चाहिए तो uuidgen इस्तेमाल करना बेहतर है (man page देखें)

    • सेल्फ-मेड scripts की तुलना में बिल्ट-इन फीचर्स इस्तेमाल करना अक्सर बेहतर होता है। उदाहरण के लिए vim में markdownquote इस्तेमाल करने के बजाय ctrl-v से पहली column चुनकर "i> " और फिर escape दबा दें। यह छोटा और ज़्यादा efficient है। मुझे यह जानने की जिज्ञासा है कि u+ 2025, ñ क्यों लौटाता है, जबकि असली Unicode value U+00F1 है। और catbin foo, cat "$(which foo)" के बराबर है। अगर आप zsh इस्तेमाल करते हैं, तो cat =foo ज़्यादा छोटा और ताकतवर है। zsh में = के बाद autocomplete काम करता है, इसलिए लंबे commands के साथ भी सुरक्षित है। मैं इसे file =firefox, vim =myscript.sh जैसी चीज़ों में अक्सर इस्तेमाल करता हूँ

    • मेरा अंदाज़ा है कि लेखक को uuidgen के बारे में पता नहीं था। ऐसी जानकारी या config साझा करने पर हमेशा मेरे blind spots सामने आते हैं, इसलिए sharing ज़रूरी है

    • Python भी डिफ़ॉल्ट रूप से JSON pretty-print कर सकता है

      $ echo '{ "hello": "world" }' | python3 -m json.tool
      {
        "hello": "world"
      }
      
    • trash जानकारी के लिए धन्यवाद। मैं अब तक कई फ़ाइलों को ट्रैश में भेजने के लिए tell app \"Finder\" to move {%s} to trash जैसी AppleScript इस्तेमाल करता था

    • rm और trash के विकल्प के रूप में rip भी recommend करता हूँ rip project link

  • डेवलपर की life cycle काफ़ी दिलचस्प होती है। शुरुआत में सिर्फ़ vanilla shell environment इस्तेमाल होता है, फिर 1~2 साल के अनुभव पर scripts और bash alias की सैकड़ों lines बना ली जाती हैं। अब 15 साल बाद मैं उल्टा जितना हो सके basic shell ही इस्तेमाल करता हूँ, alias भी नहीं रखता, और complex चीज़ें Python या Go से करता हूँ

    • यह रुझान किसी तरह की enlightenment से ज़्यादा शायद आलस से आता है (मैं भी बिल्कुल ऐसा ही हूँ, इसलिए कह रहा हूँ)। Custom environment में गहराई तक जाने वाले साथियों की वजह से नए tools सीखने को मिलते रहते हैं, और हाल में मैंने Linux में atuin, fzf जैसे tools भी जोड़े हैं

    • मैं dotfile में alias और function लिखकर अक्सर इस्तेमाल होने वाले commands को record/remember करने के लिए रखता हूँ। अपना toolset लगातार update करता रहता हूँ, और उसे नए workstation पर migrate करना भी आसान होता है

    • पहले जब मेरे पास सिर्फ़ एक nix कंप्यूटर था, तब मैं customization बहुत करना चाहता था। अब कई मशीनें साथ में इस्तेमाल करता हूँ, इसलिए सिर्फ़ ज़रूरी packages इंस्टॉल करके environment को एक जैसा रखता हूँ

    • Python में लिखी चीज़ को भी मैं script ही कहता हूँ। मेरा मानना है कि script शब्द सिर्फ़ shell script तक सीमित नहीं है

    • आजकल युवा engineers के साथ काम करते हुए जब उन्हें कई dotfiles इस्तेमाल करते देखता हूँ, तो लगता है “मैं भी पहले ऐसा ही करता था, कितना झंझट था।” अब मैं tools को चुनिंदा तरीके से इस्तेमाल करता हूँ और ज़रूरत के हिसाब से flexible customization करता हूँ। दूसरों के style का भी सम्मान करता हूँ

  • HN पर ऐसे practical tips वाले posts मिलना मुझे बहुत पसंद है। दूसरे developers वास्तव में कैसे काम करते हैं, और मैं क्या सीखकर अपनाऊँ, यह जानने में दिलचस्पी रहती है। शुरुआत में लगता है “शायद यह मेरे काम का नहीं होगा”, लेकिन अगर कोई काम आसान हो जाए तो वही काम एक नया workflow बना देता है। इसलिए मैं पहले try करता हूँ और जो suit करे उसे रखता हूँ। मूल पोस्ट का style भी पसंद आया—वास्तविक usage frequency साथ में लिखना सचमुच practical है। मैं अक्सर छोटे काम browser devtools खोलकर JavaScript से ही कर लेता हूँ। (जैसे string को lowercase करना)

    • अगर लेखक के तरीके और मेरे तरीके में लगने वाला समय, script बनाने/याद रखने/रेफ़र करने/migration की लागत तक जोड़कर असली cost-benefit analysis किया जाए, तो वह दिलचस्प होगा

    • यह Bash shortcuts cheat sheet image बहुत मददगार है

  • line script की जगह, sed से किसी खास line को print करना ज़्यादा सरल है

    sed -n 2p file
    

    इससे दूसरी line प्रिंट की जा सकती है। कई lines प्रिंट करने के लिए भी

    sed -n 2,4p file
    

    जैसा इस्तेमाल किया जा सकता है, इसलिए यह line script से बेहतर है

    • मुझे अक्सर कई sed commands को chain करना पड़ता है। तब हर बार पहली sed command बदलनी पड़ती है। कभी-कभी sed से पहले grep भी चाहिए होता है, लेकिन cat, tail, head में बाँट देने से हर चीज़ module की तरह इस्तेमाल की जा सकती है और ज़्यादा flexibility मिलती है। यह Unix philosophy के अनुरूप है कि हर utility सिर्फ़ एक काम करे
  • मेरे पास कुछ सरल scripts हैं जिन्हें मैं अक्सर इस्तेमाल करता हूँ। उदाहरण के लिए:

    #!/usr/bin/env bash
    # ~/bin/,dehex
    
    echo "$1" | xxd -r -p
    
    #!/usr/bin/env bash
    # ~/bin/,ht
    
    highlight() {
      # रंग: 30=काला, 31=लाल, 32=हरा, ...
      escape=$(printf '\033')
      sed "s,$2,${escape}[$1m&${escape}[0m,g"
    }
    
    if [[ $# == 1 ]]; then
      highlight 31 $1
    elif [[ $# == 2 ]]; then
      highlight 31 $1 | highlight 32 $2
    elif [[ $# == 3 ]]; then
      highlight 31 $1 | highlight 32 $2 | highlight 35 $3
    elif [[ $# == 4 ]]; then
      highlight 31 $1 | highlight 32 $2 | highlight 35 $3 | highlight 36 $4
    fi
    

    पर्सनल scripts के आगे , (comma) लगाकर रखा जा सकता है ताकि जल्दी switch किया जा सके। मुझे लगता है कि अपने scripts का history से समय-समय पर statistics निकालना और जो अब इस्तेमाल नहीं होते उन्हें साफ़ करना काफ़ी काम की चीज़ है

  • अभी इसे generalize नहीं किया है, लेकिन unmv script से मैं काफ़ी सुविधाजनक तरीके से काम कर रहा हूँ

    #!/bin/sh
    if test "$#" != 2
    then
      echo 'Error: unmv must have exactly 2 arguments'
      exit 1
    fi
    exec mv "$2" "$1"
    
  • यहाँ कई अच्छे tips हैं, लेकिन मैं ज़्यादातर standard utilities (sed, awk, grep, xargs आदि) सीखकर इस्तेमाल करता हूँ। वजह यह है कि मुझे कई systems पर जाकर काम करना पड़ता है, और मेरे personal scripts व alias ज़्यादातर वहाँ इंस्टॉल नहीं होते। Standard utilities से लगभग सब कुछ किया जा सकता है

    • पूरी तरह सहमत हूँ। हर जगह काम कर सकूँ, इसलिए मैं भी standards ही इस्तेमाल करता हूँ। लेकिन जो tools सच में अच्छे होते हैं, वे आख़िरकार default install का हिस्सा बन जाते हैं या apt-get से आसानी से मिल जाते हैं। Personal script collection की तुलना में अच्छी तरह managed package form ज़्यादा बेहतर लगती है
  • मैं अपना पसंदीदा extraction script साझा कर रहा हूँ

    # ex - archive extractor
    # usage: ex <file>
    function ex() {
      if [ -f $1 ] ; then
      case $1 in
        *.tar.bz2) tar xjf $1 ;;
        *.tar.gz) tar xzf $1 ;;
        *.tar.xz) tar xf $1 ;;
        *.bz2) bunzip2 $1 ;;
        *.rar) unrar x $1 ;;
        *.gz) gunzip $1 ;;
        *.tar) tar xf $1 ;;
        *.tbz2) tar xjf $1 ;;
        *.tgz) tar xzf $1 ;;
        *.zip) unzip $1 ;;
        *.Z) uncompress $1;;
        *.7z) 7z x $1 ;;
        *) echo "'$1' cannot be extracted via ex()" ;;
      esac
      else
        echo "'$1' is not a valid file"
      fi
    }
    
    • इसका उल्टा counterpart भी बनाना चाहता हूँ, जो compress करे

    • मैं dtrx इस्तेमाल करता हूँ, यह archive को अपने-आप folder के अंदर extract कर देता है, जो अच्छा लगता है

    • मुझे aunpack ज़्यादा सुविधाजनक लगता है

    • सच में बहुत साफ़-सुथरा है

    • अगर इसमें inotify और systemd user service भी जोड़ दिए जाएँ तो यह एक स्तर और आगे बढ़ जाएगा। इसका packaged version पहले से मौजूद भी है। खुद बनाना थोड़ा square wheel (reinvention) जैसा लगता है

  • mp4 encode या trim करने के लिए मैं हमेशा दो functions इस्तेमाल करता हूँ। इन flags की वजह से WhatsApp, mobile Discord जैसी कई environments में compatibility बहुत अच्छी रहती है

    ffmp4() {
      input_file="$1"
      output_file="${input_file%.*}_sd.mp4"
    
      ffmpeg -i "$input_file" -c:v libx264 -crf 33 -profile:v baseline -level 3.0 -pix_fmt yuv420p -movflags faststart "$output_file"
    
      echo "Compressed video saved as: $output_file"
    }
    
    ffmp4 foo.webm  # foo_sd.mp4 में convert
    
    fftime() {
      input_file="$1"
      output_file="${input_file%.*}_cut.mp4"
      ffmpeg -i "$input_file" -c copy -ss "$2" -to "$3" "$output_file"
    
      echo "Cut video saved as: $output_file"
    }
    
    fftime foo.mp4 01:30 01:45  # foo_cut.mp4 बनाता है
    

    fftime मूल फ़ाइल को दोबारा encode किए बिना तेज़ी से काट देता है, लेकिन वीडियो के हिसाब से थोड़ी समस्या (जैसे playback न होना) आ सकती है। दोबारा encode करना हो तो -c copy हटा दें

  • जब भी alias या function बनाकर test करता हूँ, ~/.zshrc को तुरंत reload करना सुविधाजनक लगता है, इसलिए मैं यह alias इस्तेमाल करता हूँ

    alias vz="vim ~/.zshrc && . ~/.zshrc"
    

    और Mac पर docx फ़ाइलों में grep करने के लिए यह function इस्तेमाल करता हूँ

    docgrep() {
      mdfind "\"$@\"" -onlyin /Users/xxxx/Notes 2> >(grep --invert-match ' [UserQueryParser] ' >&2) | grep -v -e '/Inactive/' | sort
    }
    

    इसके अलावा, अपने Mac के clipboard को anonymize करके ChatGPT या कंपनी के Slack जैसे public channels में paste करने से पहले debugging के लिए मैं नीचे वाला function चलाता हूँ। Function चलाने पर नया transformed clipboard stdout में भी दिखता है, इसलिए यह जाँचना आसान है कि कुछ छूट तो नहीं गया

    anonymizeclipboard() {
      my_user_id=xxxx
      account_ids="1234567890|1234567890" #regex
      corp_words="xxxx|xxxx|xxxx|xxxx|xxxx" #regex
      project_names="xxxx|xxxx|xxxx|xxxx|xxxx" # regex
      pii="xxxx|xxxx|xxxx|xxxx|xxxx|xxxx" # regex
      hostnames="xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx" # regex
      pbpaste | sed -E -e 's/([0-9]{1,3})\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/\1.x.x.x/g' \
      -e "s/(${corp_words}|${project_names}|${my_user_id}|${pii}|${hostnames})/xxxx/g" -e "s/(${account_ids})/1234567890/g" | pbcopy
      pbpaste
    }
    alias anon=anonymizeclipboard
    
    • यह सच में बहुत अच्छा है। ऐसी ज़रूरत मुझे अक्सर पड़ती है, लेकिन कोई अच्छा तरीका नहीं मिल रहा था, इसलिए काफ़ी परेशानी होती थी