होम·टर्मिनल कमांड

टर्मिनल कमांड की सूची

फ़ाइल, टेक्स्ट, git, प्रोसेस और नेटवर्क — काम आने वाले विकल्पों और उदाहरण के साथ 227 कमांड

⌨️ कमांड और विकल्प जैसे हैं वैसे ही टाइप होते हैं, इसलिए उनका अनुवाद नहीं होता — सिर्फ़ व्याख्या आपकी भाषा में है।

फ़ाइल और डायरेक्टरी32

हटाना, मिटाना और ढूँढना। कुछ कमांड दोबारा नहीं पूछते, इसीलिए -i लगाने की आदत हाथ बचाती है।

lsदिखाता है कि किसी डायरेक्टरी में क्या है; डॉट से शुरू होने वाले नाम -a लगाने तक छिपे रहते हैं।cdshell की वर्तमान डायरेक्टरी बदलता है; यह shell का अंदरूनी command है, इसलिए script या subshell के भीतर किया cd बाहरी shell को नहीं हिलाता।pwdबताता है कि आप किस डायरेक्टरी में हैं; symlink से आए हों तो डिफ़ॉल्ट रूप से link का रास्ता दिखता है, असली रास्ता केवल -P देता है।mkdirडायरेक्टरी बनाता है; -p के बिना यह तब भी रुकता है जब parent न हो और तब भी जब डायरेक्टरी पहले से हो।rmdirडायरेक्टरी को सिर्फ़ तब हटाता है जब वह ख़ाली हो; अंदर कुछ भी हो तो मना कर देता है, इसीलिए लोग rm -r की ओर जाते हैं।rmफ़ाइलें हमेशा के लिए मिटा देता है — कोई कूड़ेदान नहीं होता, और rm -rf में एक अतिरिक्त space ग़लत चीज़ उड़ा देता है।cpफ़ाइलें या पूरा पेड़ copy करता है; गंतव्य पहले से है या नहीं, यही तय करता है कि स्रोत उसी नाम का बनेगा या उसके भीतर जाएगा।mvनाम बदलता है या जगह बदलता है; -i या -n के बिना गंतव्य फ़ाइल चुपचाप ऊपर से लिख दी जाती है।touchफ़ाइल के समय को अभी कर देता है और न होने पर ख़ाली फ़ाइल बना देता है; सामग्री को कभी नहीं छूता।catफ़ाइलों को एक के बाद एक जैसा है वैसा छाप देता है; सब एक साथ निकलता है, इसलिए लंबी फ़ाइल के लिए less ठीक है और cat file | grep में एक pipe फ़ालतू है।lessफ़ाइल को पूरा पढ़े बिना एक-एक स्क्रीन दिखाता है; / से खोजें और q से निकलें, more की तरह अंत में अपने आप बंद नहीं होता।headफ़ाइल का शुरुआती हिस्सा छापता है; कई फ़ाइलें दें तो -q न हो तो हर फ़ाइल के लिए एक शीर्षक पंक्ति जुड़ जाती है।tailफ़ाइल का अंत छापता है और -f के साथ उसे देखता रहता है; log rotate होने के बाद पीछा जारी रखने के लिए -F चाहिए।findडायरेक्टरी पेड़ में घूमकर हर प्रविष्टि जाँचता है; pattern को -name '*.log' की तरह quote करें, वरना shell उसे find से पहले खोल देता है।locateडिस्क की जगह पहले से बने index में खोजता है, इसलिए तुरंत जवाब देता है, पर पिछले updatedb के बाद बनी फ़ाइलें उसे नहीं दिखतीं।treeडायरेक्टरी की बनावट को indent किए चित्र की तरह दिखाता है; macOS और हल्की Linux image में यह डिफ़ॉल्ट रूप से नहीं होता।duफ़ाइलें डिस्क पर असल में जितनी जगह लेती हैं उसे जोड़ता है; यह आवंटित block गिनता है, इसलिए इसका जोड़ फ़ाइल आकारों के जोड़ और df से अलग होता है।dfहर filesystem का इस्तेमाल और बचा स्थान बताता है; bytes बचे रहने पर भी inode ख़त्म हो सकते हैं, और वह सिर्फ़ df -i दिखाता है।lnफ़ाइल को दूसरा नाम देता है; -s से बना symlink कहीं भी इशारा कर सकता है पर लक्ष्य हटने पर टूट जाता है, और सापेक्ष रास्ता link की अपनी डायरेक्टरी से पढ़ा जाता है।statinode में लिखा ब्योरा दिखाता है — आकार, अनुमति, स्वामी और तीन समय; format विकल्प GNU में -c और BSD में -f है, जबकि GNU का -f कुछ और ही मतलब रखता है।fileफ़ाइल का प्रकार नाम से नहीं, सामग्री से पहचानता है; extension को अनदेखा करता है, इसीलिए .jpg जो असल में PDF है, यहाँ पकड़ा जाता है।basenameरास्ते से डायरेक्टरी वाला हिस्सा हटाता है और चाहें तो suffix भी काट देता है; यह केवल text का काम है, फ़ाइल है या नहीं यह नहीं देखता।dirnameरास्ते का केवल डायरेक्टरी हिस्सा रखता है; कोई slash न हो तो उत्तर एक बिंदु होता है, और basename की तरह यह भी सिर्फ़ text पर काम करता है।realpathकिसी भी रास्ते को symlink और बिंदु सुलझाकर एक absolute रास्ता बना देता है; macOS पर BSD संस्करण होता है, इसलिए --relative-to जैसे GNU विकल्प नहीं मिलते।rsyncदो पेड़ों के बीच का सिर्फ़ अंतर भेजता है, स्थानीय या ssh पर; स्रोत के अंत का slash उसकी सामग्री का अर्थ रखता है, और उसे हटाने पर डायरेक्टरी एक स्तर और गहरी चली जाती है।mountकिसी filesystem को डायरेक्टरी से जोड़ता है; mountpoint में पहले से रखी चीज़ मिटती नहीं, केवल छिप जाती है और unmount करने पर लौट आती है।umountजुड़े हुए filesystem को अलग करता है; नाम में n नहीं होता, और जब तक कोई प्रक्रिया अंदर फ़ाइल खोले रखे या उसकी कार्य-डायरेक्टरी वहीं हो, यह device is busy कहकर मना करता है।readlinkबताता है कि symlink किस पर इशारा करता है, केवल एक कदम, जब तक -f न लगाएँ; जो फ़ाइल link नहीं है उस पर कुछ नहीं छापता और त्रुटि के साथ ख़त्म होता है।mktempअनुमान न लगने वाले नाम से अस्थायी फ़ाइल या डायरेक्टरी बनाकर उसका रास्ता छापता है; यह ख़ुद सफ़ाई नहीं करता, इसलिए बाहर निकलते समय trap के साथ रखें।sha256sumफ़ाइल का SHA-256 निशान छापता है ताकि पता चले कि download पूरा आया या नहीं; मिलान यह साबित करता है कि bytes वही हैं, यह नहीं कि स्रोत भरोसेमंद है।truncateफ़ाइल की लंबाई ठीक उतनी कर देता है: बढ़ाने पर केवल sparse छिद्र बनता है, जगह आवंटित नहीं होती, और घटाने पर पिछला हिस्सा बिना चेतावनी चला जाता है।shredमिटाने से पहले bytes ऊपर से लिख देता है, पर SSD और btrfs या APFS जैसे copy-on-write systems में पुराने block बचे रह सकते हैं, इसलिए असली उत्तर पूरी डिस्क का encryption है।

टेक्स्ट प्रोसेसिंग32

ये पाइप से जोड़कर चलाने के लिए बने हैं। एक ही कमांड से सब करवाने के बजाय तीन जोड़ना छोटा पड़ता है।

grepपाठ में से pattern से मेल खाती पंक्तियाँ चुनता है; डिफ़ॉल्ट basic regex है, इसलिए + ? | और () को -E या backslash चाहिए।sedपाठ को पंक्ति-दर-पंक्ति बदलता है, अक्सर s/old/new/ से; जगह पर बदलने वाला -i GNU और BSD में अलग है, और अंत में g न हो तो हर पंक्ति में पहला मेल ही बदलता है।awkहर पंक्ति को खानों में बाँटकर उन पर एक छोटा program चलाता है; $0 पूरी पंक्ति है और $1 पहला खाना, और डिफ़ॉल्ट विभाजक एक space नहीं, बल्कि लगातार आने वाला रिक्त स्थान है।sortपंक्तियों को क्रम में लगाता है; -n के बिना तुलना text की तरह होती है इसलिए 10, 9 से पहले आता है, और क्रम locale तय करता है जब तक आगे LC_ALL=C न लगाएँ।uniqकेवल आस-पास पड़ी एक जैसी पंक्तियों को एक कर देता है, फ़ाइल में बिखरी नक़लों को नहीं, इसलिए इसे लगभग हमेशा sort के बाद लगाया जाता है।wcपंक्तियाँ, शब्द और bytes गिनता है; -l newline अक्षर गिनता है, इसलिए अंतिम पंक्ति में newline न हो तो वह गिनती में नहीं आती।cutतय खाने या अक्षर-स्थान काटकर निकालता है; विभाजक एक ही अक्षर होता है और लगातार विभाजक जुड़कर एक नहीं बनते, इसलिए space से सजी तालिका awk का काम है।pasteफ़ाइलों को एक-दूसरे के बग़ल में tab लगाकर जोड़ता है; join की तरह नहीं, यह सामग्री देखे बिना केवल पंक्ति-स्थान से मिलाता है।trअक्षरों को एक-के-बदले-एक बदलता या हटाता है; यह केवल standard input पढ़ता है, इसलिए फ़ाइल का नाम देने पर काम नहीं चलता — < से भेजें या pipe करें।joinदो फ़ाइलों को साझा खाने पर जोड़ता है, database के join की तरह; दोनों फ़ाइलें उस खाने से पहले से क्रमित होनी चाहिए, वरना पंक्तियाँ चुपचाप छूट जाती हैं।commदो क्रमित फ़ाइलों की तुलना करके तीन स्तंभ दिखाता है — केवल बाएँ, केवल दाएँ, दोनों में; बिन क्रमित input से नतीजा बेमानी होता है, और विकल्प स्तंभ चुनते नहीं, छिपाते हैं।diffदो फ़ाइलों में क्या बदला यह दिखाता है; patch और code review जिस रूप की अपेक्षा करते हैं वह -u है, और अंतर होने पर exit code 1 होता है, जिससे set -e वाली script वहीं रुक जाती है।patchdiff को असली फ़ाइलों पर लागू करता है; -p तय करता है कि रास्ते के कितने हिस्से हटाने हैं, और git के diff को a/ तथा b/ उपसर्ग के कारण -p1 चाहिए।teeअपने input को एक साथ फ़ाइल में और स्क्रीन पर भेजता है; root की फ़ाइल में लिखने का यही तरीक़ा है, क्योंकि sudo cmd > file में redirect आपका ही shell खोलता है।xargsआने वाली पंक्तियों को दूसरे command के तर्कों में बदल देता है; नामों में space हो तो टूट जाता है, जब तक दोनों तरफ़ NUL न हो — यानी find -print0 के साथ xargs -0।echoअपने तर्क जैसे हैं वैसे छापकर नई पंक्ति देता है; -e और backslash का बरताव shell-shell में बदलता है, इसलिए भरोसे के लिए printf लें।printfC के printf की तरह एक ढाँचे से पाठ बनाता है; अपनी ओर से newline नहीं जोड़ता और तर्क बचे रहने तक ढाँचे को शुरू से दोहराता है।jqJSON को अपनी छोटी भाषा से छानकर नया आकार देता है; यह अक्सर पहले से स्थापित नहीं होता, और strings के quote हटाने के लिए -r चाहिए।columnखानों में भराव डालकर स्तंभ तालिका की तरह सीधे कर देता है; लगातार विभाजक एक ही गिने जाते हैं, इसलिए ख़ाली कोष्ठ वाला CSV खिसक जाता है।foldलंबी पंक्तियों को तय चौड़ाई पर काटकर असली newline डालता है; -s के बिना शब्द बीच से कट जाते हैं, और terminal की दिखावटी लपेट से अलग यह सामग्री ही बदल देता है।nlछापते समय पंक्तियों को क्रमांक देता है; डिफ़ॉल्ट रूप से ख़ाली पंक्तियाँ नहीं गिनता, इसलिए editor के अंकों से मेल नहीं खाता — -b a देने पर मिल जाता है।revहर पंक्ति के भीतर अक्षरों का क्रम उलट देता है, पंक्तियों का क्रम नहीं — वह काम tac का है।splitफ़ाइल को कई टुकड़ों में काटता है; शीर्षक पंक्ति केवल पहले टुकड़े में रहती है, और नाम aa, ab जैसे अक्षरों में बनते हैं जब तक -d न दें।csplitफ़ाइल को तय आकार पर नहीं, बल्कि जहाँ pattern मिलता है वहाँ काटता है; जो अंक छपते हैं वे bytes हैं, और {*} का अर्थ है जितनी बार मेल हो उतनी बार दोहराओ।expandtab अक्षरों को space में बदल देता है; Makefile को असली tab चाहिए, इसलिए उस पर expand चलाने से build टूट जाता है।shufपंक्तियों को बेतरतीब क्रम में निकालता है; यह GNU coreutils का है और macOS में नहीं होता, जहाँ इसकी जगह चलने वाला sort -R एक जैसी पंक्तियों को साथ बाँध देता है।tacफ़ाइल की पंक्तियाँ आख़िर से पहली तक छापता है; यह GNU coreutils का है, macOS पर tail -r चलता है, और यह rev नहीं है जो अक्षर उलटता है।stringsकिसी binary से पाठ जैसा दिखने वाला हिस्सा खींच लेता है; जो भी text जैसा लगे वह उठा लेता है, इसलिए ज़्यादातर निकला हुआ अर्थ नहीं, संयोग है।iconvपाठ की character encoding बदलता है; जिस byte को मैप नहीं कर पाता वहीं रुक जाता है, जब तक -c न दें, और input की encoding वह ख़ुद नहीं पहचान सकता।vimयह mode वाला editor है: जब तक i न दबाएँ, टाइप करने से कुछ नहीं होता, और Esc के बाद :wq से सहेजकर या :q! से छोड़कर बाहर आते हैं।nanoएक सीधा पूरे परदे वाला editor जिसके आदेश नीचे लिखे रहते हैं; ^O और ^X में लगा caret अक्षर नहीं, Ctrl का अर्थ रखता है।base64bytes को ASCII पाठ में और वापस बदलता है ताकि binary केवल-पाठ रास्तों से जा सके; यह encoding है, encryption नहीं, और decode का विकल्प GNU में -d पर पुराने macOS में -D है।

git45

उलझन यह है कि पीछे लौटने के कई रूप हैं — ब्रांच का इशारा हटाना और उलटने वाला कमिट जोड़ना एक बात नहीं।

git initकिसी फ़ोल्डर को नया git repository बना देता है; सिर्फ़ init से कोई फ़ाइल ट्रैक नहीं होती, add और commit अलग से करने पड़ते हैं।git cloneरिमोट repository को इतिहास के साथ कॉपी करता है; --depth 1 वाले clone में पुराने commit और दूसरी branch नहीं होतीं, बाद में --unshallow चाहिए।git configgit की सेटिंग पढ़ता और लिखता है; --global के बिना यह सिर्फ़ इसी repository में जाती है, नए clone को उसका पता नहीं होता।git init --bareबिना working tree वाला repository बनाता है, जो सिर्फ़ push लेने के लिए होता है; उसमें फ़ाइलें संपादित नहीं होतीं, पर checked-out branch की वजह से कोई push रुकता भी नहीं।git addफ़ाइल को उसी क्षण की हालत में staging पर रखता है; add के बाद फिर बदलाव किया तो वह छूट जाता है और दोबारा add करना पड़ता है।git commitstaging में रखी चीज़ों को एक commit के रूप में दर्ज करता है; -a सिर्फ़ पहले से ट्रैक हो रही फ़ाइलें लेता है, नई फ़ाइलें छूट जाती हैं।git statusबताता है क्या staged है, क्या बदला है और क्या untracked; untracked फ़ाइलें फ़ोल्डर के नाम में सिमट जाती हैं, एक-एक देखने के लिए -uall चाहिए।git diffसिर्फ़ वे बदलाव दिखाता है जो अभी staged नहीं हैं; इसीलिए git add के तुरंत बाद खाली लगता है — तब --staged लगाएँ।git logcommit इतिहास नए से पुराने क्रम में दिखाता है, पर सिर्फ़ मौजूदा HEAD के पूर्वज; बाकी branch देखने के लिए --all चाहिए।git showएक commit को उसके संदेश और diff के साथ दिखाता है; <commit>:<path> लिखने पर फ़ाइल का पुराना रूप working copy छेड़े बिना निकल आता है।git blameहर पंक्ति के साथ वह commit दिखाता है जिसने उसे अंत में बदला; सिर्फ़ formatting वाला commit असली लेखक छिपा देता है, इसीलिए -w और --ignore-rev हैं।git branchbranch सूचीबद्ध करता, बनाता और स्थानीय रूप से मिटाता है; मिटाने पर remote की प्रति बची रहती है, सर्वर के लिए git push origin --delete अलग से चाहिए।git checkoutbranch बदलने और फ़ाइल लौटाने वाला पुराना आदेश, जो git 2.23 में switch और restore में बँट गया; checkout -- <file> बिना commit किए बदलाव हमेशा के लिए मिटा देता है।git switchgit 2.23 का आदेश जो सिर्फ़ branch बदलता है; फ़ाइलों की सामग्री कभी नहीं लौटाता, वह काम restore का है।git restoreफ़ाइल की सामग्री लौटाने वाला git 2.23 का आदेश; डिफ़ॉल्ट रूप से यह working फ़ाइल को ऊपर लिख देता है और बिना commit बदलाव चले जाते हैं, जबकि --staged सिर्फ़ unstage करता है।git mergeदूसरी branch का काम मौजूदा branch में मिला देता है; --squash कोई merge दर्ज नहीं करता, इसलिए git उस branch को बाद में भी unmerged मानता रहता है।git rebaseआपके commit को नई नींव पर फिर से रखता है; hash बदल जाते हैं, इसलिए जिस branch को दूसरे पहले ही खींच चुके हैं उसे rebase न करें — वहाँ merge करें।git resetbranch के pointer को दूसरे commit पर ले जाता है: --soft सब कुछ staged छोड़ता है, --mixed (डिफ़ॉल्ट) staging भी खाली करता है पर बदलाव फ़ाइलों में रहते हैं, और --hard उन बदलावों को भी हमेशा के लिए मिटा देता है।git revertकिसी commit को उलटने वाला नया commit जोड़कर उसे रद्द करता है; इतिहास मिटता नहीं, जबकि reset pointer सरकाता है — इसलिए push हो चुके काम को revert से लौटाएँ।git cherry-pickकिसी एक commit को नए hash के साथ मौजूदा branch पर कॉपी करता है, इसलिए बाद में उस branch को merge करने पर वही बदलाव दो बार दिख सकता है।git stashअधूरे बदलाव किनारे रखकर पेड़ साफ़ कर देता है; untracked फ़ाइलें -u के बिना पीछे छूट जाती हैं, और pop प्रविष्टि हटा देता है जबकि apply उसे रखता है।git cleanuntracked फ़ाइलें मिटा देता है, जिनकी git के पास कभी प्रति नहीं थी, सो कुछ वापस नहीं आता; -fdx स्थानीय .env जैसी ignored फ़ाइलें भी हटाता है, पहले -n चलाएँ।git remoteरिमोट repository के नाम और URL सँभालता है; यह उन्हें केवल दर्ज करता है, fetch या push करने तक कुछ आता-जाता नहीं।git fetchनए commit उतार लेता है पर आपकी फ़ाइलों और branch को नहीं छूता, इसलिए merge या rebase बाद में करना पड़ता है, और सर्वर पर मिटी branch --prune तक दिखती रहती है।git pullfetch और merge को एक ही बार में करता है, यहीं से अनचाहे merge commit आते हैं; --rebase या --ff-only उन्हें रोकता है।git pushआपके commit remote पर भेजता है; --force remote branch को ऊपर लिख देता है और दूसरों के commit तक मिटा सकता है, इसलिए --force-with-lease लगाएँ, जो remote बदल गया हो तो मना कर देता है।git tagकिसी commit पर version जैसा नाम लगा देता है; सादा git push tag नहीं भेजता, tag को नाम से अलग push करना पड़ता है।git rmफ़ाइल को index और डिस्क दोनों से हटाता है; --cached फ़ाइल रखता है और सिर्फ़ ट्रैकिंग रोकता है, पर पुरानी सामग्री इतिहास में बनी रहती है, इसलिए लीक हुआ secret वहीं रहता है।git mvफ़ाइल हटाकर दूसरी जगह रखता है और उसी क़दम में stage भी कर देता है; git rename सहेजता नहीं, मिलते-जुलते content से अनुमान लगाता है, इसलिए सिर्फ़ केस बदलने पर macOS और Windows में -f चाहिए।git ls-filesडिस्क की जगह index में दर्ज पथ सूचीबद्ध करता है, इसलिए script के लिए यही भरोसेमंद सूची है; -i अकेले नहीं चलता, उसके साथ -c या -o और --exclude-standard चाहिए।git update-indexindex को सीधे बदलता है; ये निशान स्थानीय होते हैं और कभी push नहीं होते, और ट्रैक हो रही config फ़ाइल में अपने बदलाव बचाने वाला विकल्प --skip-worktree है, --assume-unchanged नहीं।git sparse-checkoutgit 2.25 में जुड़ा यह आदेश बड़े repository में सिर्फ़ बताए गए फ़ोल्डर डिस्क पर रखता है; इतिहास पूरा ही रहता है और cone mode glob नहीं, फ़ोल्डर के नाम लेता है।git reflogHEAD और आपकी branch जिन जगहों पर रही हैं, सब दर्ज रखता है; reset --hard या मिटी branch से खोए commit यहीं मिलते हैं, पर प्रविष्टियाँ डिफ़ॉल्ट 90 दिन में मिट जाती हैं और यह रिकॉर्ड सिर्फ़ आपकी मशीन पर होता है।git bisectcommit की सीमा को आधा-आधा करके पहला ख़राब commit खोजता है; अंत में git bisect reset करना ज़रूरी है, वरना आप detached commit पर ही अटके रह जाते हैं।git describeसबसे नज़दीकी tag से मौजूदा commit को v1.2.0-5-gabc1234 जैसा नाम देता है; डिफ़ॉल्ट रूप से यह केवल annotated tag देखता है, इसलिए lightweight tag के लिए --tags और बिना tag वाले repository के लिए --always चाहिए।git rev-parseHEAD या v1.2.0^ जैसे नाम को असली hash में बदलता है और repository कहाँ है यह भी बताता है; script में branch का नाम --abbrev-ref HEAD से मिलता है, और repository के बाहर यह त्रुटि के साथ ख़त्म होता है।git fsckobject database की जाँच करता है और उन commit को गिनाता है जिन्हें कोई नहीं दिखाता — reflog मिट जाने के बाद reset से खोया काम खोजने का दूसरा रास्ता; यह बताता है, ठीक नहीं करता।git gcबिखरे object पैक करता है और जिनका कोई सहारा नहीं उन्हें हटाकर .git छोटा करता है; --prune=now उन commit को भी फेंक देता है जिन्हें reflog पकड़े हुए था, और reset पलटने का सुरक्षा-जाल ख़त्म हो जाता है।git archiveकिसी एक commit की फ़ाइलों को tar या zip के रूप में बाहर लिखता है; .git और untracked फ़ाइलें छूट जाती हैं, इसलिए फ़ोल्डर को सीधे ज़िप करने से यह साफ़ release पैकेज बनता है।git applyकिसी diff फ़ाइल को आपके working tree पर लगाता है; यह commit नहीं बनाता और patch में लिखा लेखक भी नहीं पढ़ता, इसलिए ईमेल से आए patch के लिए am ठीक है।git amईमेल से आए patch को मूल लेखक और संदेश के साथ commit बना देता है; बीच में विफल हो तो वहीं रुक जाता है, इसलिए --continue, --skip या --abort से पूरा करना पड़ता है।git format-patchहर commit के लिए एक ईमेल-शैली .patch फ़ाइल लिखता है; format-patch main का मतलब main के बाद के commit हैं, main स्वयं नहीं।git shortlogcommit को लेखक के हिसाब से समूह बनाकर गिनता है, release notes के लिए उपयोगी; एक ही व्यक्ति के दो ईमेल हों तो .mailmap के बिना वह दो बार गिना जाता है।git worktreeउसी repository से दूसरा working फ़ोल्डर निकालता है, जिससे दोबारा clone किए बिना दो branch साथ चल सकें; एक ही branch दो जगह checkout नहीं हो सकती, और फ़ोल्डर हाथ से मिटाने पर prune तक प्रविष्टि बची रहती है।git submoduleकिसी दूसरे repository को एक commit पर स्थिर करके आपके repository के भीतर रखता है; सादा clone उस फ़ोल्डर को update --init तक खाली छोड़ देता है, और parent branch नहीं, commit पकड़ता है।

प्रोसेस और सिस्टम36

क्या चल रहा है और क्या मशीन खा रहा है। मारने से पहले पहचानना क्रम है।

psचल रही प्रक्रियाओं का एक बार का स्नैपशॉट देता है; `ps aux` बिना डैश वाला BSD रूप है और `ps -ef` POSIX रूप, और दोनों को मिलाना आम गलती है।topहर कुछ सेकंड में प्रक्रिया सूची फिर से बनाता है; इसके फ़्लैग प्लेटफ़ॉर्म के अनुसार पूरी तरह अलग हैं — एक बार का स्नैपशॉट Linux पर `-b -n 1` और macOS पर `-l 1` है।htoptop का रंगीन, माउस-समर्थित नया रूप जिसमें F9 सीधे सिग्नल भेजता है, पर यह डिफ़ॉल्ट रूप से नहीं आता — पहले `apt install htop` या `brew install htop` चाहिए।killकिसी PID को सिग्नल भेजकर प्रक्रिया बंद करता है; डिफ़ॉल्ट TERM उसे सफ़ाई का मौका देता है, जबकि `-9` को रोका नहीं जा सकता, इसलिए खुली फ़ाइलें और लॉक फ़ाइलें पीछे रह जाती हैं।killallPID की जगह नाम से प्रक्रियाएँ मारता है; नाम को executable से पूरा मेल खाना चाहिए, इसलिए `killall chrome` "Google Chrome" नाम की प्रक्रिया छोड़ देता है।pkillपैटर्न से मेल खाती हर प्रक्रिया को मारता है; `-f` के बिना केवल नाम की तुलना होती है, और ढीला पैटर्न ज़रूरत से ज़्यादा मार देता है — इसलिए पहले उसी पैटर्न से pgrep चलाएँ।pgrepपैटर्न से मेल खाने वाले सिर्फ़ PID छापता है, ठीक pkill जैसे ही नियमों से — यानी कुछ मारने से पहले का अभ्यास।jobsशेल का अंतर्निहित आदेश जो केवल इसी शेल के बैकग्राउंड जॉब गिनता है, इसलिए दूसरे टर्मिनल के जॉब कभी नहीं दिखते और उन्हें PID से नहीं, `%1` की तरह बताया जाता है।bgCtrl+Z से रोके गए जॉब को बैकग्राउंड में फिर चलाता है; वह अब भी इसी शेल का है, इसलिए टर्मिनल बंद करने पर साथ चला जाता है — जब तक nohup या disown न हो।fgबैकग्राउंड या रुके हुए जॉब को टर्मिनल में वापस लाता है; यह केवल इसी शेल के जॉब पर चलता है और उन्हें PID से नहीं, `%1` जैसे जॉब नंबर से बताया जाता है।nohupकिसी आदेश को hangup सिग्नल नज़रअंदाज़ कराता है ताकि वह लॉगआउट के बाद भी चले; यह उसे बैकग्राउंड में नहीं भेजता, `&` आपको खुद जोड़ना पड़ता है, और आउटपुट चुपचाप ./nohup.out में जमा होता है।niceकिसी आदेश को कम CPU प्राथमिकता के साथ शुरू करता है; मान 19 (सबसे उदार) से -20 (सबसे लालची) तक है, ऋणात्मक मान के लिए root चाहिए, और यह केवल CPU पर असर करता है, डिस्क पर नहीं (उसके लिए ionice)।reniceपहले से चल रही प्रक्रिया की प्राथमिकता बदलता है; सामान्य उपयोगकर्ता उसे केवल अधिक उदार बना सकता है, प्राथमिकता वापस लेने के लिए root चाहिए।systemctlsystemd सेवाओं को शुरू, बंद और जाँचता है; `enable` केवल बूट व्यवहार तय करता है, इसलिए अभी भी चालू करने के लिए `enable --now` लें, और unit फ़ाइल बदलने के बाद `daemon-reload` चलाएँ।journalctlsystemd द्वारा जमा किया गया बाइनरी लॉग पढ़ता है; /var/log/journal न हो तो रीबूट पर लॉग मिट जाता है, और `-u` को unit का ठीक नाम चाहिए।serviceSysV युग से बचा हुआ पतला आवरण; systemd मशीन पर यह बस systemctl को आगे भेज देता है और कम क्रियाएँ समझता है।crontabप्रति-उपयोगकर्ता समय-सारणी संभालता है; cron लगभग खाली PATH के साथ चलता है और लॉगिन प्रोफ़ाइल कभी नहीं पढ़ता, इसलिए पूर्ण पथ लिखें — और `crontab -r` पूरी तालिका बिना पूछे मिटा देता है।atबताए हुए समय पर किसी आदेश को ठीक एक बार चलाता है; atd डीमन चालू होना चाहिए (अक्सर वह स्थापित ही नहीं होता) और आउटपुट स्क्रीन पर नहीं, मेल से आता है।uptimeबताता है मशीन कितनी देर से चालू है और लोड औसत क्या है; वे तीन संख्याएँ 1, 5 और 15 मिनट में चलने को तैयार प्रक्रियाओं का औसत हैं, प्रतिशत नहीं — इसलिए 4 कोर पर 4.00 का मतलब पूरा भरा हुआ है।freeLinux पर बची हुई मेमोरी और स्वैप गिनता है; पढ़ने वाला स्तंभ free नहीं, available है, क्योंकि कैश ज़रूरत पड़ने पर लौटा दिया जाता है — और macOS में free नहीं होता (वहाँ vm_stat)।vmstatनिश्चित अंतराल पर मेमोरी, स्वैप, डिस्क और CPU के काउंटर छापता है; पहली पंक्ति फेंक दें, वह अभी का नहीं बूट के बाद का औसत है, और पहले si/so तथा wa स्तंभ देखें।iostatहर डिस्क का थ्रूपुट और अनुरोधों का प्रतीक्षा समय दिखाता है; पहला खंड बूट के बाद का औसत है, Linux पर sysstat पैकेज चाहिए, और macOS `-w 1 -c 5` जैसे भिन्न फ़्लैग लेता है।lsblkडिस्क और उनके विभाजनों को पेड़ की तरह दिखाता है; बिना विभाजन वाली खाली जगह नहीं दिखाता (उसके लिए fdisk या parted) और यह केवल Linux पर है, macOS में `diskutil list` लें।unameकर्नेल का नाम, उसका रिलीज़ और मशीन की आर्किटेक्चर बताता है; डिस्ट्रो का नाम नहीं बताता, उसके लिए /etc/os-release पढ़ें (macOS पर `sw_vers`), और `-o` केवल GNU में है।hostnameइस मशीन का नाम छापता या बदलता है; `hostname web01` अगले रीबूट तक ही टिकता है, इसलिए स्थायी करने के लिए Linux पर `hostnamectl` या macOS पर `scutil --set HostName` लें, और सभी IP दिखाने वाला `-I` केवल Linux में है।dateवर्तमान समय को मनचाहे रूप में छापता है और तारीख़ का गणित करता है; `+` के बाद का रूप हर जगह एक जैसा है, पर तारीख़ खिसकाना GNU में `-d` और macOS/BSD में `-v` या `-j -f` है।envपूरा एनवायरनमेंट छापता है, या अतिरिक्त वेरिएबल के साथ एक आदेश चलाता है; वे वेरिएबल केवल उसी एक बार के लिए लगते हैं और शेल में कुछ नहीं बचता।exportकिसी वेरिएबल पर निशान लगाता है ताकि चाइल्ड प्रक्रियाएँ उसे पाएँ; यह इस शेल के साथ ख़त्म हो जाता है, इसलिए बनाए रखने के लिए ~/.bashrc या ~/.zshrc में लिखें, और export के बिना केवल `VAR=x` चलाए जाने वाले प्रोग्राम को नहीं दिखता।whichPATH में खोजकर बताता है कि उस नाम का executable कहाँ है; चूँकि यह केवल PATH देखता है, alias, function और shell builtin के बारे में झूठ बोलता है — सच्चा उत्तर `type -a` या `command -v` देता है।typeशेल से ही पूछता है कि कोई नाम असल में क्या है — alias, function, builtin या फ़ाइल — यही वह चीज़ है जो केवल PATH देखने वाला `which` नहीं देख पाता।lsofहर खुली फ़ाइल और सॉकेट सूचीबद्ध करता है, इसी से पता चलता है कि पोर्ट 3000 किसने पकड़ रखा है; sudo के बिना आप केवल अपनी प्रक्रियाएँ देखते हैं, इसलिए खाली परिणाम का अर्थ नहीं है कि पोर्ट खाली है।fuserपता लगाता है — और कहें तो मार देता है — कि कोई फ़ाइल, माउंट या पोर्ट कौन इस्तेमाल कर रहा है; `-k` SIGKILL भेजता है, सफ़ाई का मौका नहीं देता, और यह केवल Linux (psmisc) में है क्योंकि macOS संस्करण में सिर्फ़ `-cfu` हैं।watchहर कुछ सेकंड में वही आदेश दोबारा चलाकर स्क्रीन नए सिरे से बनाता है; pipe या `*` वाले आदेश को उद्धरण में रखें, वरना शेल उसे एक बार watch पर ही लगा देगा — और macOS में यह नहीं आता।timeoutकिसी आदेश को समय-सीमा में चलाता है और सीमा पार होने पर काट देता है, exit code 124 के साथ; डिफ़ॉल्ट सिग्नल TERM है जिसे अटका प्रोग्राम नज़रअंदाज़ कर सकता है, इसलिए `-k` जोड़कर KILL भेजें (GNU coreutils, macOS में नहीं)।straceकिसी प्रक्रिया के हर सिस्टम कॉल को छापता है, इससे दिखता है वह कहाँ अटकी है; आउटपुट stderr पर जाता है, इसलिए `2>&1` से मोड़ें, ptrace अनुमति (आम तौर पर sudo) चाहिए, और यह केवल Linux पर है (macOS में dtruss)।dmesgकर्नेल का रिंग बफ़र पढ़ता है, डिस्क या USB की गड़बड़ी के बाद पहली जगह जहाँ देखना चाहिए; बफ़र का आकार तय है इसलिए पुरानी पंक्तियाँ जा चुकी होती हैं, और अब अधिकांश डिस्ट्रो root माँगते हैं (macOS में `log show`)।

नेटवर्क28

कनेक्शन न बने तो ये बताते हैं कि बात कहाँ तक पहुँची — नाम हल नहीं हुआ, रास्ता नहीं, या पोर्ट बंद है।

curlकिसी URL को लाकर उसका मुख्य भाग टर्मिनल पर छापता है; ब्राउज़र के उलट यह `-L` के बिना रीडायरेक्ट का पीछा नहीं करता, इसलिए 301 आने पर खाली उत्तर जैसा लगता है।wgetकिसी URL को फ़ाइल में डाउनलोड करता है और रीडायरेक्ट अपने आप निभाता है; यही curl से अंतर है, जो कहे बिना टर्मिनल पर छापता है — और macOS में wget नहीं आता।pingICMP echo भेजकर देखता है कि होस्ट जवाब देता है या नहीं और कितनी देर लगती है; जवाब न आना मतलब बंद होना नहीं, क्योंकि कई फ़ायरवॉल ICMP गिरा देते हैं जबकि TCP ठीक चलता है।tracerouteगंतव्य तक पैकेट जिन राउटरों से गुज़रता है उन्हें एक-एक पंक्ति में दिखाता है; बीच में `* * *` का मतलब रास्ता टूटा नहीं, बस वह राउटर जवाब नहीं देता।digसीधे DNS सर्वर से पूछकर रिकॉर्ड जैसे आते हैं वैसे दिखाता है; यह /etc/hosts और सिस्टम कैश को छोड़ देता है, इसलिए उत्तर ब्राउज़र से भिन्न हो सकता है, और कुछ डिस्ट्रो में पहले dnsutils या bind-utils चाहिए।nslookupनाम से पता निकालने का पुराना औज़ार: यह अब भी चलता है, पर इसका आउटपुट और exit status इतने अस्थिर हैं कि स्क्रिप्ट में बेकार हैं, और अब dig ने इसकी जगह ले ली है।hostनाम पूछने पर दो-तीन छोटी पंक्तियों में पते और मेल सर्वर बताता है; झटपट जाँच के लिए सबसे सुविधाजनक, पर पूरे रिकॉर्ड देखने के लिए dig चाहिए।ssLinux पर खुले सॉकेट सूचीबद्ध करने का आधुनिक तरीक़ा, netstat का उत्तराधिकारी और व्यस्त होस्ट पर बहुत तेज़; ध्यान रहे `-p` मालिक प्रक्रिया केवल root होने पर दिखाता है।netstatसॉकेट और रूटिंग टेबल देखने का पुराना तरीक़ा; Linux पर इसकी जगह ss ने ले ली है और अक्सर यह स्थापित ही नहीं होता, और macOS इसे रखता है पर यह नहीं बताता कि सॉकेट किस प्रक्रिया का है — वह उत्तर lsof देता है।ipLinux में पते, रूट और neighbour तालिका सब संभालने वाला एक ही आदेश, जो ifconfig, route और arp की जगह लेता है; इससे किया कोई भी बदलाव रीबूट पर मिट जाता है, जब तक नेटवर्क कॉन्फ़िग में भी न लिखा जाए।ifconfigनेटवर्क इंटरफ़ेस देखने और बदलने का पुराना आदेश; Linux में `ip addr` ने इसकी जगह ले ली है, यह स्थापित ही न हो सकता है और ip से जोड़े सभी पते नहीं दिखाता — पर macOS में यह आज भी असली औज़ार है।routeकर्नेल की रूटिंग टेबल पढ़ता और बदलता है, पर Linux में इसकी जगह `ip route` ने ले ली है, और BSD/macOS में व्याकरण ही अलग है, जैसे `route -n get default` — इसलिए उदाहरण दोनों जगह नहीं चलते।arpएक ही स्थानीय नेटवर्क के पड़ोसियों के MAC पतों की तालिका दिखाता है; राउटर के उस पार का कुछ भी इसमें कभी नहीं होता, और Linux में आजकल का औज़ार `ip neigh` है।nc (netcat)कच्चा TCP या UDP कनेक्शन खोलकर देखता है कि पोर्ट जवाब देता है या नहीं, और दो मशीनों के बीच बाइट बहाता है; एक ही नाम के तीन असंगत netcat हैं (OpenBSD, GNU, Nmap का ncat), इसलिए `-z` या `-p` आपके यहाँ हो भी सकता है और नहीं भी।telnetसादा TCP सत्र खोलता है जिसमें सब कुछ बिना एन्क्रिप्शन जाता है, इसलिए लॉगिन के लिए इसे कभी न लें (वह ssh का काम है); बचा हुआ उपयोग यह देखना है कि पोर्ट जवाब देता है या नहीं, और निकलने के लिए Ctrl+] फिर quit।sshदूसरी मशीन पर एन्क्रिप्टेड शेल खोलता है; जिस निजी कुंजी को दूसरे पढ़ सकें उसे ssh सिरे से मना कर देता है, इसलिए `chmod 600` करें, और पोर्ट यहाँ `-p` है पर scp तथा sftp में `-P`।ssh-keygenसार्वजनिक और निजी कुंजी की जोड़ी बनाता है; सर्वर पर केवल `.pub` वाला आधा जाता है, और बिना passphrase बनाई कुंजी एक सादी फ़ाइल है जिसे कोई भी कॉपी करके लॉगिन कर सकता है।ssh-copy-idआपकी सार्वजनिक कुंजी को सर्वर के ~/.ssh/authorized_keys में जोड़ देता है ताकि वह पासवर्ड न माँगे; उस पहली बार के लिए पासवर्ड लॉगिन खुला होना चाहिए, और `-i` को निजी कुंजी नहीं, `.pub` फ़ाइल दें।sftpssh कनेक्शन के ऊपर चलने वाला संवादात्मक फ़ाइल-स्थानांतरण औज़ार; पोर्ट का फ़्लैग ssh वाले `-p` की जगह बड़ा `-P` है, और यह रिमोट शेल आदेश नहीं चला सकता, केवल अपने put, get और ls समझता है।scpssh के ज़रिये फ़ाइलें एक बार में कॉपी करता है; पोर्ट बड़ा `-P` है, रिमोट पथ में कोलन चाहिए, और बड़े या बार-बार होने वाले स्थानांतरण के लिए rsync बेहतर है क्योंकि वह अपरिवर्तित फ़ाइलें छोड़ देता और अधूरा काम आगे बढ़ाता है।iptablesचालू पैकेट फ़िल्टर को बदलता है; नियम ऊपर से नीचे जाँचे जाते हैं और पहला मेल जीतता है, इसलिए ACCEPT के बाद जोड़ा गया DROP कभी नहीं चलता, बिना सहेजे नियम रीबूट पर मिट जाते हैं, और पोर्ट 22 खोलने से पहले डिफ़ॉल्ट नीति DROP करने पर दूरस्थ मशीन से आप ही बाहर हो जाते हैं।ufwDebian और Ubuntu पर iptables को आसान शब्दों में लपेटने वाला फ़ायरवॉल; `enable` से पहले SSH खोल लें वरना आप अपनी ही चालू सत्र काट देंगे, और Docker पोर्ट सीधे iptables में डालता है जहाँ ufw के नियम नहीं पहुँचते।tcpdumpतार से गुज़र रहे पैकेट जैसे हैं वैसे पकड़ लेता है; इसे root चाहिए, क्या पकड़ना है यह फ़्लैग के बाद अपनी अलग फ़िल्टर भाषा में लिखा जाता है जैसे `port 443 and host x`, और व्यस्त इंटरफ़ेस पर बिना फ़िल्टर पकड़ने से टर्मिनल तुरंत दब जाता है।whoisकिसी डोमेन या IP ब्लॉक का पंजीकरण रिकॉर्ड देखता है; निजी जानकारी अब अधिकतर छिपी होती है और हर TLD सर्वर अपने ढंग से उत्तर सजाता है, इसलिए स्क्रिप्ट में उस आउटपुट को पार्स करना जल्दी टूटता है।nmapकिसी होस्ट को खँगालकर देखता है कि कौन-कौन से पोर्ट जवाब देते हैं; `-sS` और `-O` के लिए root चाहिए, और पराई मशीन स्कैन करना उसके लॉग में हमले की तरह दर्ज होता है और कई देशों में अवैध है — इसलिए अपने ही नेटवर्क तक सीमित रहें।openssl s_clientकच्चा TLS कनेक्शन खोलता है ताकि आप प्रमाणपत्र और handshake देख सकें; `-servername` छोड़ देने पर एक ही पते पर कई साइट रखने वाला सर्वर अपना डिफ़ॉल्ट प्रमाणपत्र देता है, और `< /dev/null` के बिना यह इनपुट की प्रतीक्षा में अटका रहता है।speedtestनज़दीकी सर्वर से वास्तविक ट्रैफ़िक भेजकर लाइन की गति नापता है; यह किसी भी सिस्टम में पहले से नहीं होता, और एक ही नाम के दो अलग प्रोग्राम हैं (Ookla का speedtest और Python का speedtest-cli) जिनके फ़्लैग भिन्न हैं।mtrtraceroute और ping को एक ही लगातार अद्यतन होती तालिका में मिला देता है, रुक-रुक कर होने वाले नुक़सान के लिए सही औज़ार; बीच के hop पर दिखता नुक़सान आम तौर पर उस राउटर का जवाब सीमित करना होता है, और असली समस्या केवल वह है जो अंतिम hop तक बनी रहे।

आर्काइव14

बाँधना और दबाना अलग काम हैं: tar बाँधता है, gzip छोटा करता है, और .tar.gz दोनों है।

tarफ़ाइलों को एक ही बंडल में बाँधता है पर खुद कुछ छोटा नहीं करता — दबाने का काम `-z` (gzip), `-j` (bzip2) और `-J` (xz) करते हैं; बनाने के `-c`, खोलने के `-x` और सूची के `-t` में से ठीक एक चुनें, और `-f` को सबसे अंतिम फ़्लैग रखें, क्योंकि उसके तुरंत बाद बंडल का नाम आता है।gzipएक फ़ाइल को .gz में दबाता है और सफल होते ही मूल फ़ाइल डिफ़ॉल्ट रूप से मिटा देता है, इसलिए उसे रखने के लिए `-k` लगाएँ या `-c` से मानक आउटपुट पर लिखें; यह कई फ़ाइलों को एक में नहीं बाँधता, इसीलिए पहले tar आता है।gunzip.gz को खोलकर मूल फ़ाइल वापस बनाता है और सफल होने पर .gz हटा देता है — `-k` उसे बचा लेता है, उसी नाम की फ़ाइल पहले से हो तो `-f` चाहिए, और `-c` सामग्री को डिस्क पर लिखे बिना मानक आउटपुट पर भेज देता है, ठीक zcat की तरह।ziptar से उलट यह संपीड़न खुद अपने भीतर रखता है और यही वह रूप है जिसे Windows बिना कुछ इंस्टॉल किए खोल लेता है; किसी डायरेक्टरी के लिए `-r` ज़रूरी है, वरना केवल फ़ोल्डर की प्रविष्टि जाती है और भीतर का कुछ नहीं, और `-e` वाला पासवर्ड पुराना ZipCrypto है, जो कमज़ोर है।unzip.zip को खोलता है, और `-d` न देने पर सब कुछ सीधे मौजूदा डायरेक्टरी में उलट देता है, इसलिए पहले `-l` से देखें कि भीतर कोई शीर्ष फ़ोल्डर है या नहीं; पुराने Windows पर बने zip के नामों के लिए `-O CP932` चाहिए, और `-P` से दिया पासवर्ड शेल के इतिहास और ps में दिखता रहता है।bzip2gzip से ज़्यादा कसकर दबाता है पर समय भी ज़्यादा लेता है, और gzip की तरह मूल फ़ाइल मिटाकर सिर्फ़ .bz2 छोड़ता है जब तक `-k` न दें; tar में इसका अक्षर `-j` है और खोलना `-d` से होता है, वही काम bunzip2 करता है।xzतीनों आम रूपों में सबसे छोटा परिणाम देता है, पर धीमा है और `-9` पर लगभग 700 MB मेमोरी माँगता है; `-T0` न जोड़ें तो एक ही कोर पर चलता है, `-k` के बिना मूल फ़ाइल मिटा देता है, और tar में इसका अक्षर बड़ा `-J` है।zcat.gz के भीतर का पाठ डिस्क पर खोले बिना सीधे मानक आउटपुट पर बहा देता है, इसी तरह घुमाए गए लॉग पर जहाँ है वहीं grep किया जाता है; `-f` उसी चक्कर में बिना दबी फ़ाइलों को भी गुज़र जाने देता है, और bzip2, xz तथा zstd के लिए अलग bzcat, xzcat और zstdcat हैं।7zपहले एक क्रिया लिखकर चलता है — जोड़ने के लिए `a`, पथ सहित निकालने के लिए `x`, सपाट निकालने के लिए `e`, सूची के लिए `l` — और .7z के अलावा zip, tar तथा rar भी पढ़ लेता है, कसाव भी अधिकतर से ज़्यादा है; निर्गम डायरेक्टरी `-o` के तुरंत बाद बिना जगह छोड़े लिखी जाती है, और नाम भी छिपाने के लिए `-p` के साथ `-mhe=on` जोड़ना पड़ता है।ddब्लॉक-दर-ब्लॉक नक़ल करता है, इसी से इंस्टॉलर इमेज किसी डिवाइस पर लिखी जाती है; `of=` में जो लिखा है वह बिना किसी पुष्टि के, ब्लॉक शून्य से ऊपर लिख दिया जाता है और वापसी का कोई रास्ता नहीं, इसलिए Enter दबाने से ठीक पहले lsblk से डिवाइस का नाम फिर जाँचें, गति के लिए `bs=4M` लें और चाल देखने के लिए `status=progress` (macOS पर Ctrl+T)।splitबड़ी फ़ाइल को टुकड़ों में काटता है; डिफ़ॉल्ट कटाई पंक्तियों से होती है, एक बार में 1000, इसलिए आकार से काटना हो तो `-b 100M` जैसा लिखें; उपसर्ग न दें तो टुकड़े xaa, xab बनते हैं, और जोड़ने के लिए एक `cat part_* > file` काफ़ी है, जो केवल इसलिए चलता है कि प्रत्यय क्रम में सजते हैं।cpioयह पुराना संग्राहक है जो पैक करने वाले नामों की सूची मानक इनपुट से लेता है, इसीलिए उसे आम तौर पर find खिलाता है; `-o` संग्रह बनाता है, `-i` उसे खोलता है, `-t` सूची दिखाता है, `-H newc` वही पोर्टेबल रूप है जिसे initramfs इमेज इस्तेमाल करती हैं, और `--no-absolute-filenames` किसी और के भेजे संग्रह को पूर्ण पथ पर लिखने से रोकता है।zstdयह आजकल वाला दबाने वाला औज़ार है: gzip जितना आकार कई गुना तेज़ी से देता है और `-19` पर xz के आकार के पास पहुँचता है, वह भी xz के समय के एक अंश में; gzip से उलट यह मूल फ़ाइल डिफ़ॉल्ट रूप से रखता है (`--rm` उसे मिटाता है), `-T0` सारे कोर लगाता है, और tar में इसे `--zstd` से बुलाया जाता है।rarयह मालिकाना रूप है जिसमें मुफ़्त सिर्फ़ खोलना है: संग्रह बनाने के लिए पैसे वाला rar बाइनरी चाहिए, जबकि किसी का भेजा .rar `unrar x` से या RARLAB से कुछ भी इंस्टॉल किए बिना `7z x` से खुल जाता है; `x` सहेजे गए पथ रखता है, `e` उन्हें सपाट कर देता है, `-hp` नाम भी छिपाता है और `-v100m` उसे खंडों में बाँट देता है।

अनुमतियाँ15

संख्या मोड और अक्षर मोड एक ही चीज़ कहते हैं: 755 और u=rwx,go=rx एक ही अनुमति है।

chmodफ़ाइलों और डायरेक्टरियों के अनुमति bits तय करता है; chmod -R 755 सामान्य फ़ाइलों को भी executable बना देता है, इसलिए फ़ाइलें छोड़नी हों तो बड़ा X इस्तेमाल करें।chownफ़ाइल का स्वामी और समूह बदलता है; फ़ाइल किसी और को देना केवल root कर सकता है, इसीलिए लगभग हमेशा sudo चाहिए।chgrpफ़ाइल का केवल समूह बदलता है, जो chown भी :group से कर सकता है; root न हों तो सिर्फ़ उस समूह में डाल सकते हैं जिसके आप सदस्य हैं।umaskतय करता है कि नई बनने वाली फ़ाइलों से कौन-से अनुमति bits हटाए जाएँ; यह देता नहीं, घटाता है, इसलिए 022 से फ़ाइलें 644 और डायरेक्टरियाँ 755 बनती हैं, और पहले से मौजूद फ़ाइलें अछूती रहती हैं।sudoएक command को दूसरे उपयोगकर्ता, डिफ़ॉल्ट रूप से root, के रूप में चलाता है; sudo cmd > file में > आपके ही shell से खुलता है, इसलिए root की फ़ाइल पर वह विफल रहता है और वहाँ tee काम आता है।suउस उपयोगकर्ता के ही password से दूसरा उपयोगकर्ता बन जाता है — sudo के उलट, जो आपका password पूछता है; dash न लगाएँ तो आपका PATH बना रहता है, जो command not found का आम कारण है।idबताता है कि प्रक्रिया किस उपयोगकर्ता और समूह के साथ चलती है; id -u का 0 आना root होना है, और scripts इसी से व्यवस्थापक अधिकार जाँचती हैं।groupsबताता है कि उपयोगकर्ता किन समूहों में है; usermod से अभी जोड़ा समूह अगले login तक नहीं दिखता, क्योंकि सूची session शुरू होते समय तय हो जाती है।whoamiअभी प्रभावी उपयोगकर्ता का नाम छापता है, login वाला नाम नहीं, इसलिए sudo या su के भीतर यह root बताता है।passwdlogin का password बदलता है और उसका hash /etc/shadow में रखता है; macOS में Linux के लगभग कोई विकल्प नहीं होते, वहाँ dscl या Settings चलते हैं।getfaclस्वामी, समूह और अन्य से अलग जुड़ी पहुँच-सूची छापता है; यह acl पैकेज वाले Linux की चीज़ है, जबकि macOS अपनी तरह की ACL ls -le से दिखाता है।setfaclस्वामी बदले बिना किसी अतिरिक्त उपयोगकर्ता या समूह को अधिकार देता है; ACL बनते ही ls अनुमति के बाद + दिखाता है, और mask प्रविष्टि दिए गए अधिकारों को चुपचाप घटा सकती है।chattrfilesystem स्तर के गुण लगाता है, जैसे immutable; +i लगने पर root को भी पहले उसे हटाना पड़ता है, और यह केवल Linux के ext4, xfs, btrfs पर चलता है।xattrmacOS पर विस्तारित गुण पढ़ता और हटाता है, अक्सर com.apple.quarantine, जो app के क्षतिग्रस्त होने की चेतावनी की असली वजह है; Linux में getfattr और setfattr चलते हैं।visudo/etc/sudoers को lock और syntax जाँच के साथ संपादित करता है; उस फ़ाइल को सीधे बदलकर ग़लती कर दें तो सबका sudo बंद हो जाता है, और visudo इसी को रोकता है।

पैकेज और रनटाइम25

सवाल हमेशा यही है कि क्या कहाँ जाए: इस प्रोजेक्ट के भीतर, या पूरी मशीन पर।

npm installpackage.json में लिखी dependency को node_modules में लाता है और package-lock.json अद्यतन करता है; npm 7 से peer dependency भी अपने आप आ जाती हैं, और --production की जगह --omit=dev आ गया।npm cinode_modules मिटाकर ठीक वही स्थापित करता है जो package-lock.json कहता है; यह lockfile बदलता नहीं और package.json से मेल न खाने पर सीधे विफल हो जाता है, इसीलिए CI में install की जगह यही चलता है।npm runpackage.json के scripts भाग में लिखा आदेश चलाता है; script के लिए तर्क देने हों तो पहले अकेला -- चाहिए, और run के बिना सिर्फ़ start और test बुलाए जा सकते हैं।npm initpackage.json बना देता है; npm init <name> बिलकुल दूसरी चीज़ है — यह create-<name> उतारकर चला देता है, जैसे npx करता है।npxकिसी package की executable चलाता है, पहले node_modules/.bin देखता है और न मिले तो अस्थायी रूप से उतार लेता है; टाइपिंग की एक ग़लती अनजान package ले आ सकती है, इसलिए --no से इसे स्थानीय तक सीमित रखें।yarn addpackage जोड़ता है और yarn.lock अद्यतन करता है; अकेला yarn का मतलब install है, और Yarn 2 से yarn global add हट गया, इसलिए एक बार के औज़ार yarn dlx से चलाएँ।pnpm addpackage को साझा store में रखता है और node_modules में link से जोड़ता है; workspace की जड़ में pnpm सादा add मना कर देता है और -w या --filter माँगता है।npm auditस्थापित पेड़ में ज्ञात कमज़ोरियाँ बताता है; fix --force ऐसे major संस्करण ले आता है जो चीज़ें तोड़ देते हैं, और dev-only गहरी dependency की चेतावनियाँ अक्सर ठीक ही नहीं हो पातीं।npm publishpackage को registry पर चढ़ाता है; scoped नाम डिफ़ॉल्ट रूप से निजी होता है इसलिए --access public चाहिए, और कोई भी version संख्या दोबारा काम नहीं आती, सो पहले --dry-run से फ़ाइल सूची देख लें।node --versionPATH में सबसे पहले मिलने वाले node का संस्करण छापता है; इसीलिए version manager होने पर editor का terminal या CI job दूसरा संस्करण बता सकता है।nvm useबदलता है कि मौजूदा shell कौन-सा स्थापित Node इस्तेमाल करे; यह बदलाव उसी shell तक रहता है, इसलिए नया terminal या CI job डिफ़ॉल्ट पर लौट आता है, और nvm एक shell function है सो script या Makefile को पहले nvm.sh source करना पड़ता है।brew installmacOS और Linux पर पहले से बनी bottle लाकर स्थापित करता है; ग्राफ़िकल ऐप के लिए --cask चाहिए, और नए संस्करण पर जाना brew update तथा brew upgrade का काम है, install का नहीं।apt-get installपहले से उतारी गई package सूची से चुनकर स्थापित करता है, इसलिए पुरानी सूची पर "Unable to locate package" आता है जब तक apt-get update न चले; script के लिए apt-get स्थिर है, जबकि apt इंसानों के लिए बना है।apt updateसिर्फ़ package सूचियाँ ताज़ा करता है, कुछ स्थापित या अद्यतन नहीं होता — उसके लिए apt upgrade चाहिए; नए container में सूची ख़ाली होती है, सो यही पहला आदेश है।dnf installसक्रिय repository से dependency सुलझाकर स्थापित करता है और metadata अपने आप ताज़ा करता है, इसलिए apt जैसा अलग update नहीं चाहिए; RHEL 8 से yum दरअसल dnf का link है, और Fedora 41 से dnf5 आ गया।pacman -SArch के sync repository से package स्थापित करता है; distribution rolling है, इसलिए -Sy से सिर्फ़ सूची ताज़ा करके स्थापित करना आधा-अधूरा upgrade बनाता है जो library तोड़ देता है — हमेशा -Syu करें।pip installजो Python सक्रिय है उसी में package स्थापित करता है; python -m pip से बुलाने पर वह पुरानी गड़बड़ टलती है जहाँ pip किसी दूसरे interpreter का होता है, और PEP 668 के बाद system Python virtual environment के बाहर स्थापना मना कर देता है।pip freezeस्थापित हर package को उसके ठीक संस्करण के साथ छापता है, जिसे requirements.txt में मोड़ा जा सकता है; इसमें आपकी चुनी हुई के साथ अप्रत्यक्ष dependency भी आती हैं, इसलिए इसे virtual environment के भीतर ही चलाएँ।python -m venvएक फ़ोल्डर में अलग interpreter और site-packages बनाता है; बनाने से कुछ नहीं होता, उसे activate करना या सीधे .venv/bin/python बुलाना पड़ता है, और रास्ते अंदर लिखे होते हैं सो बाद में फ़ोल्डर का नाम बदलने पर यह टूट जाता है।docker runहर बार image से एक नया container बनाकर चलाता है, इसलिए दो बार चलाने पर दो container बन जाते हैं और रुके हुए को फिर चलाना docker start है; -p के बिना host से कुछ नहीं पहुँचता, और -v के बिना जो लिखा जाता है container के साथ मिट जाता है।docker psसिर्फ़ अभी चल रहे container दिखाता है; जो शुरू होते ही बंद हो गया वह -a लगाने तक नहीं दिखता, और जब docker run ने कुछ न किया हो तो वहीं देखना चाहिए।docker buildDockerfile से image बनाता है; अंत का बिंदु वह build context है जो daemon को भेजा जाता है, इसलिए भारी फ़ोल्डर build धीमा कर देता है (.dockerignore से छाँटें), और COPY उसी context के भीतर की फ़ाइलें ही देख पाता है।docker compose upcompose.yaml में लिखी सभी service को एक परियोजना के रूप में चालू करता है; हाइफ़न वाला docker-compose सेवानिवृत्त v1 है और अब docker compose plugin है, और मौजूदा container --build या --force-recreate के बिना वैसे ही दोबारा काम में आते हैं।docker execपहले से चल रहे container के भीतर दूसरा process चलाता है; रुके हुए container पर यह विफल हो जाता है, और slim image में bash नहीं होता सो sh से घुसना पड़ता है।docker logscontainer के मुख्य process ने stdout और stderr पर जो लिखा वही दिखाता है; अगर app container के भीतर किसी फ़ाइल में log लिखता है तो यहाँ कुछ नहीं आता, और container मिटने पर log भी चले जाते हैं।

कैसे पढ़ें

  • बड़े कोष्ठक [ ] उस हिस्से को दिखाते हैं जिसे छोड़ा जा सकता है।
  • तीन बिंदु … का मतलब है एक से ज़्यादा दिए जा सकते हैं।
  • विकल्पों में बड़े-छोटे अक्षर मायने रखते हैं — कुछ कमांड में -r और -R अलग काम करते हैं।

आम सवाल

Q. कमांड के नाम का अनुवाद क्यों नहीं होता?

क्योंकि उन्हें वैसे ही टाइप करना होता है। अनुवाद किया हुआ ls शेल के लिए अजनबी नाम है। विकल्प भी इसी वजह से वैसे ही रहते हैं — भाषा सिर्फ़ व्याख्या की बदलती है।

Q. macOS और Linux में विकल्प अलग दिखते हैं।

अलग हैं। macOS में BSD टूल आते हैं, इसलिए कुछ GNU विकल्प नहीं होते — sed -i को एक आर्गुमेंट चाहिए, ps -ef नहीं लेता। जहाँ फ़र्क़ है, वहाँ व्याख्या में लिखा है कि किस सिस्टम का है।

Q. जो कमांड पलटी नहीं जा सकतीं, उन्हें कैसे पहचानूँ?

उनकी व्याख्या में लिखा है। rm कूड़ेदान से नहीं जाता, of= ग़लत हो तो dd डिस्क पर लिख देता है, और git reset --hard तथा git clean -fd बिना कमिट किया काम फेंक देते हैं।