नवीनतम (2017) के रूप में के लिए POSIX कल्पना के संस्करण rm
उपयोगिता है यहाँ (और पिछले एक वहाँ ) और का विलोपन मनाही .
और ..
।
यदि किसी भी फाइल डॉट या डॉट-डॉट को किसी ऑपरेंड के बेसनमे भाग के रूप में निर्दिष्ट किया जाता है (जो कि, अंतिम पाथनाम घटक है) या यदि कोई ऑपरेंड रूट डाइरेक्टरी को हल करता है, तो rm एक डायग्नोस्टिक संदेश को मानक त्रुटि पर लिखेगा और कुछ भी नहीं करेगा इस तरह के ऑपरेंड के साथ।
जैसा कि @jlliagre ने कहा है, /
SUSv4 में इसके अलावा हिस्सा है।
सबसे पुराना सार्वजनिक रूप से उपलब्ध यूनिक्स युक्ति जो मुझे मिल सकती है ( XPF4 CAE rev2 (1994)), पहले से ही निर्दिष्ट है .
और ..
इसे हटाया नहीं जा सकता है, हालांकि GNU फ़ाइलटाइल चेंगलॉग में टिप्पणी से पता चलता है कि यह पुराने POSIX में पहले से ही मौजूद था।
ध्यान दें कि यह करने के लिए लागू होता है dir/..
और ../
साथ ही साथ, लेकिन कुछ कार्यान्वयन (सोलारिस 11 और MacOS तरह यूनिक्स प्रमाणित भी शामिल होते हैं) अभी भी के खिलाफ की रक्षा नहीं करते rm -rf ../
या rm -rf .*/
)।
इतिहास
प्रारंभिक यूनियनों
यह -r
विकल्प rm
यूनिक्स V3 (1973) में जोड़ा गया था, हालांकि यह केवल निर्देशिकाओं की सामग्री को हटा रहा था, फिर भी आपको rmdir
निर्देशिकाओं को हटाने के लिए उपयोग करना होगा।
यह यूनिक्स V7 (1979, रिलीज में बदल गया, जिसमें बॉर्न शेल भी शामिल था और जिसमें से अधिकांश यूनिकस निकलते हैं)। rm -r
अब निर्देशिका को भी हटा दिया है और ..
निर्देशिका पेड़ को नहीं हटाया जाएगा । आदमी पेज कहता है:
..
अनजाने में कुछ ऐसा करने के असामाजिक परिणामों से बचने के लिए केवल फ़ाइल को निकालना मना है rm -r .*
।
(हालांकि कोई यह तर्क दे सकता है कि rm -r .*
यह अभी भी असामाजिक है क्योंकि यह सब कुछ हटा देता है क्योंकि .
इसमें शामिल है)।
यह अभी भी हटाने को स्वीकार करता है, .
हालांकि यह .
या ..
प्रविष्टियों को अनलिंक नहीं करेगा । तो, rm -r .
वर्तमान निर्देशिका को खाली करने का एक प्रभावी तरीका था।
यह भी ध्यान दें कि सुरक्षा केवल शाब्दिक ..
तर्क के लिए थी, dir/..
या नहीं के लिए ./..
। इसलिए, rm -rf ./.*
अभी भी मूल निर्देशिका में सब कुछ हटा देगा।
यह देखना दिलचस्प है कि यह पहले से ही बग / मिसफिट को हल करने के लिए था जिसके द्वारा ग्लोब को शामिल किया जा सकता है .
और ..
उनके विस्तार में। यह 80 के दशक के उत्तरार्ध में फोर्सिथ शेल (मूल मिनिक्स शेल और पीडीएक्स के लिए आधार) में तय किया गया था, zsh
और fish
(2005) लेकिन अन्य गोले नहीं थे और विशेष रूप से पोसिक्स sh
भाषा .*
में शामिल करने के लिए .
और ..
यदि आवश्यक नहीं है वे द्वारा दिया जाता है readdir()
( bash
केवल के साथ आंशिक रूप से समस्या को संबोधित करता shopt -s dotglob
globs (जहां .xxx
वाले) को शामिल नहीं करते .
या ..
, और साथ ksh
, आप इसे करने से ठीक कर सकते हैं FIGNORE='@(.|..)'
)।
जब बिल्कुल मना .
किया गया और साथ ही जोड़ा गया तो हमेशा स्पष्ट नहीं होता है और प्रत्येक यूनिक्स के साथ बदलता रहता है। नीचे कुछ निष्कर्ष।
BSDs
.
2.9BSD (1983) और 2.10BSD (1987) के बीच और 4.2BSD (1983) और 4.3BSD (1986) के बीच कुछ समय के लिए मना किया गया था ( इस परिवर्तन को यूनिक्स-इतिहास-रेपो में 1985 देखें )।
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");
के लिए dir/.
और dir/..
, देखने के लिए 1988 में इस परिवर्तन (BSD 4.3 नेट / 1)।
इस तिथि तक, rm
FreeBSD (और macOS की तरह व्युत्पन्न) अभी भी चालू या मूल निर्देशिका को ( rm -rf ./
या उसके rm -rf ../
लिए मायने रखता है rm -rf .*/
) खाली कर देता है ।
सिस्टम वी
मेरे पास ज्यादा जानकारी नहीं है क्योंकि V7 के बाद AT & T Unix डेरिवेटिव के लिए न तो स्रोत या बाइनरी सार्वजनिक रूप से उपलब्ध हैं। अपने ऑनलाइन मैनुअल में, एचपीयूसी (सिस्टम III पर आधारित) में अभी भी उल्लेख है कि यह केवल मना करता है ..
जबकि प्रभावी रूप से यह दोनों को मना करता है जो कि एक संकेत है कि शायद कम से कम SysIII ने हटाने को मना नहीं किया .
( संपादित करें : अब SshIII rm
स्रोत कोड को देख रहा है , यह है) लगभग यूनिक्स V7 के बाद अपरिवर्तित)।
अन्य सभी ऑनलाइन मैनुअल जिनका मैंने उल्लेख किया है हटाने .
या ..
निषिद्ध है जो कि POSIX अनुरूप होने की उम्मीद है।
सोलारिस rm
अभी भी वर्तमान या मूल निर्देशिका को खाली करता है rm -rf ./
या rm -rf ../
।
जीएनयू
जीएनयू fileutils के लिए जल्दी बदलाव का सभी ऐतिहासिक जानकारी नहीं है।
जबकि मूल रूप से न तो हटाने .
या ..
मना किया ..
गया था , पहले मना किया गया था और फिर दोनों (शामिल dir/.
), सभी 1990 और 1991 के बीच।
अन्य
जैसा कि हमने देखा, में zsh
, .*
(या किसी ग्लोब) का विस्तार कभी भी शामिल नहीं है .
या ..
(यहां तक कि sh
अनुकरण मोड में भी )। rm
निर्मित (जो आप अगर तुम मिल zmodload zsh/files
) इसलिए इलाज नहीं है .
या ..
विशेष रूप से। तो, उस zsh
बिलिन के साथ , आप खाली या rm -rf .
या कर सकते हैं , लेकिन हटाएंगे या नहीं ।rm -rf ..
.
..
rm -rf .*
.
..
बिजीबॉक्स में rm
, हटाने की मनाही .
और ..
0.52 (2001) में जोड़ा गया था
rm
, लेकिन मैंने सोचा कि यह उल्लेख आप अभी भी साथ अवांछित परिणाम प्राप्त हो सकते हैं कि लायक थाchmod
,chown
, आदि जब मिलान.*
।