Bash kabuğundaki bir komutu tersine çevirmek mümkün mü?


12

Ben bash kabuk yürütülen bir komutu yeniden / (basit) bir olasılık olup olmadığını merak ediyordum? (geri almak için)

Herhangi bir eylemi (örneğin, sözcük veya LibreOffice) yeniden yapmak için ctrl+ zkombinasyonuna benzer bir şey var mı ?


8
kısa cevap hayır. bazı komutlar geri alınabilir, ancak genel bir geri alma işlemi yoktur.
Archemar

3
diğerlerinin söylediği gibi, hiçbir undoişletim sisteminin güncel bir yedeğine sahip olmak hiç bir komut almaz. Bir şeyler ters gittiğinde önceki durumu geri yüklersiniz. Bir göz atın rsnapshot örneğin
Arkadiusz Drabczyk

1
dur -p komutunu geri almanın bir yolunu bulmak istiyorum
Skaperen

3
@Joshua Bir kullanıcının verilerini yok edebilecek bir komutla yorum göndermek ve hiçbir açıklama kabul edilemez bir davranış değildir. Komik değil, siteyi tıkıyor ve en önemlisi tehlikeli. Bunu bir daha yapma.
terdon

2
Ben shutdownlol komutunu geri almak istiyorum .. böyle sorular da bir günde 8 upvotes alabilirsiniz inanamıyorum !!
MagExt

Yanıtlar:


33

Bunun bashsadece bir yürütme ortamı olduğunu anlamalısınız . Aradığınız komutları yürütür - komutun ne yaptığını bile bilmek kabuğun işi değildir, istediğiniz herhangi bir yürütülebilir dosyayı arayabilirsiniz. Çoğu durumda, bir geri almanın ne yapacağını bile net değildir - örneğin, bir filmi "oynatabilirsiniz" mı? Bir e-postayı "gönderemez" misiniz? Örneğin, "firefox'u çalıştırmayı geri al" ne anlama gelir? Kapatabilirsiniz, ancak yer işaretleri, indirmeler ve geçmiş aynı olmaz.

Bir komutu çalıştırırsanız, ne yaparsa yapın yürütülür. Ne yaptığınızı bilmek size kalmış. Bunun tek tek komutların "geri al" olmadığı anlamına gelmediğini unutmayın ... yapabilirler - sizi aptalca hatalardan korumak için bir şeyler yapan bir sarmalayıcı işlevi bile yazabilirsiniz.

Örneğin, bir mvşeyin üzerine yazmadıkça dosyayı sadece geldiği yere geri taşıyarak kolayca geri döndürülebilir. Bu yüzden -iüzerine yazmadan önce sormak için geçiş var. Teknik olarak, ters ait cpolan rmbir şey üzerine yazıldığı sürece, (yine -ibu konuda size sorar). rmdaha kalıcı, dosyaları geri almaya çalışmak için, aslında biraz daha düşük seviye hack yapmak zorundasınız (bunun için araçlar var). Dosya sistemini bir kara kutu olarak değerlendirdiyseniz, teknik olarak mümkün olmazdı (sadece mantıksal ve fiziksel veri düzeninin ayrıntıları bazı hasar kontrolleri yapmanıza izin verir). rmaraçlar rmsize "çöp" işlevselliği istiyorsanız, bu sadece aslındamvbazı önceden düzenlenmiş bir dizine (ve muhtemelen korumak veya boşaltmak için zamanlanmış bir hizmet) - bu konuda özel bir şey yok. Ancak -isilmeden önce sizi uyarmak için kullanabilirsiniz . -iBu komutlara her zaman dahil etmek için bir işlev veya takma ad kullanabilirsiniz .

Çoğu uygulamanın sizi farklı şekillerde veri kaybından koruduğunu unutmayın. Çoğu (~ tümü) metin düzenleyici ~, eski sürümü geri getirmek istediğinizde sonunda yedek dosyalar oluşturur . Bazı dağıtımlarda, lsvarsayılan -Bolarak diğer adları gizlenir, böylece onları gizler ( ), ancak oradalar. İzinleri düzgün bir şekilde yöneterek çok fazla koruma sağlanır: gerekmedikçe root olmayın, değiştirilmesini istemiyorsanız dosyaları salt okunur yapın. Bazen bir "korumalı alan" ortamına sahip olmak yararlı olabilir - bir kopya üzerinde bir şeyler çalıştırırsınız, sorun olup olmadığını görürsünüz ve sonra değişiklikleri birleştirirsiniz (veya değişiklikleri terk edersiniz). chrootveya lxcbetiklerinizin bir dizinden kaçmasını ve zarar vermesini önleyebilir.

Bir şeyleri toplu olarak yürütmeye çalıştığınızda - örneğin, karmaşık bir find komutunuz varsa, while döngüsü, uzun bir boru hattı veya bunun gibi bir şey varsa, önce sadece echoçalıştırılacak komutları kullanmak iyi bir fikirdir . Ardından, komutlar makul görünüyorsa, kaldırın echove gerçekte çalıştırın. Ve elbette, ne yaptığınızdan gerçekten emin değilseniz, önce bir kopya alın. Bazen geçerli dizinin bir tarball'ını oluşturuyorum.

Tarballlardan bahsetmek - tarbombs ve zipbombs maalesef oldukça yaygındır (insanlar uygun bir alt dizin olmadan bir arşiv oluşturduğunda ve paketin açılması dosyaları etrafa saçar, büyük bir karmaşaya neden olur). Sadece (ben açmadan önce bir alt dizin kendim yapmaya alıştım olabilir içeriğini listelemek ama tembelim). Sadece içeriği bir alt dizin olmadan arşivlendiğinde bir alt dizin oluşturacak bir komut dosyası yapmayı düşünüyorum. Ancak gerçekleştiğinde, ls -lrtait oldukları yere koymak için en son dosyaları bulmaya yardımcı olur. Bunu sadece bir örnek olarak verdim - bir programın kabuğun bilmediği birçok yan etkisi olabilir (Nasıl denebilir? Bu farklı bir program olarak adlandırılır!) Hatalardan kaçınmanın tek kesin yolu dikkatli olmaktır (düşünmek iki kez, bir kez çalıştırın).

Muhtemelen en tehlikeli komutlar dosya sistemi ile ilgilenenlerdir: mkfs, fdisk / gdisk ve benzeri. Dosya sistemini tamamen yok edebilirler (uygun adli yazılıma rağmen, en azından kısmi tersine mühendislik mümkündür). Komutu çalıştırmadan önce biçimlendirdiğiniz cihazı ve bölümlendirmenin doğru olup olmadığını her zaman iki kez kontrol edin.


14

Hayır, Bash'te "geri al" diye bir şey yok, üzgünüm. Bu yüzden önce komutlarınızı iki kez kontrol etmeli veya önemsiz dosyalarda test etmelisiniz (mümkünse). Ve bir şeyleri kök olarak yapıp yapmadığınızı üç kez kontrol edin;)


1
Ctr + /, bash terminalindeki belirli Kontrol komutları için geri alma işlemi gerçekleştirir, ancak tüm komutlar geri alınamaz.
Eric Leschinski

@EricLeschinski Herhangi bir referans verebilir misiniz?
Erathiel

Bu sayfanın yanıt yorumlarına gömülmüştür: skorks.com/2009/09/bash-shortcuts-for-maximum-productivity Çalışmasını görmek için terminalde bazı kelimeler yazın. İmleci bir karakterin üzerinde hareket ettirin, karakterin altında silmek için Ctrl-d tuşlarına basın ve ardından silmeyi geri alan Ctrl + / tuşlarına basın.
Eric Leschinski

1
Oh, ama bu bir komutu geri almaktan temelde farklı bir şey. İle bir dosyayı kaldırırsanız rm, dosya kayboldu, kayboldu, öldü, artık yok, eski bir dosya (Monty Python uyarısı). Şimdi akrabaları üzüntüyle ağlıyor ve sen tapuyu geri alamazsın. Bahsettiğiniz şey karakterleri yazmayı veya silmeyi geri almanız ve bunun terminal emülatörünüzün bir özelliği olduğundan şüpheleniyorum. Terminator'de denedim ve işe yarıyor. Farklı bir konsola geçmek (benim durumumda Ctrl + Alt + F1) çalışmasına izin vermiyor.
Erathiel

Terminal komut girişi geri alma ve yürütme geri alma işleminden sonra terminal komutu var. Buraya ilkini aramaya geldim.
Eric Leschinski

11

Hayır, genel bir geri alma yoktur, ancak bazı sonuçlar diğerlerinden daha tersine çevrilebilir. Örneğin rm, iki amaç için kullanılır - karışıklıktan kaçınmak ve yeni dosyalar için yer açmak. Biraz şansla, dosya içeriğini aşağıdaki araçları kullanarak alabilirsiniz extundelete, çünkü çalıştırdığınızda sadece dosyanın başlangıcındaki işaretçinin üzerine yazılır rm; içerik işletim sistemi (daha sonra milisaniye veya yıl sonra da olabilir) bu alanı yeniden kullanır zaman üzerine yazılır. Bu işlevsellik nedeniyle, az ya da çok yıkıcı bir sistem ölçeğininrm ortasında yer alır . Bir yandan çöp varverileri derhal kaybetme riski olmayan dağınıklığı önlemenin bir yolunu sağlayan sistemler (geri alma önemsiz olduğu için). Daha da muhafazakar bir kez yazılır , verilerin sistem tarafından kendisine yazılmasıyla silinemediği veya üzerine yazılamayacağı birçok ("WORM") sistemi okuyun . Ölçeğin diğer ucunda , işaretçiye ek olarak dosya içeriklerinin (genellikle birden çok kez) üzerine yazılan parçalama sistemleri bulunur . Bu noktada verilerinizi kurtarma teknolojisi muhtemelen henüz mevcut değildir (ve muhtemelen asla mevcut olmayabilir).

Böylece en çok kullanılan aracın ( rm) tek alternatif olmadığını, ancak çoğu insanın rahat ettiği bir takas sağlar:

  • Bir dosya işaretçisini silmek çok hızlıdır ve diskin bozulmasına çok az katkıda bulunur
  • Yüksek derecede otomatikleştirilmiş sistemlerde alanınız kalma olasılığı düşüktür
  • Çok mütevazı ama sıfır olmayan gizlilik koruması sağlar ve tersine kurtarma garantileri sağlar
  • Düşük karmaşıklık ve bu nedenle düşük hata veya beklenmedik davranış şansı

Aletlerinizin yaptığı takaslar sizin için kabul edilemezse, etrafınıza bakın. Muhtemelen sizin için doğru olan kararları veren araçlar vardır .


3
Bu cevabın soruyu ele alan tek kısmı ilk satırdır
Alvaro

Sadece şeylerin neden böyle olduğunu, sistematik bir perspektiften açıklamaya çalışıyorum.
l0b0

9

'Geri al' özelliği sağlayan uygulamalar, gerçekleştirilen eylemlerin geçmişini ve eylemi tersine çevirme yöntemini veya önceki durumu geri yüklemek için bir nesnenin durumunun anlık görüntüsünü koruyarak bunu yapar. Kabukta yürütülen komutlar doğrudan eylemler gerçekleştirir veya eylemleri gerçekleştirmek için komutları yürütür.

Kabuğun kendisi, çalıştırılan herhangi bir komut veya programdan kaynaklanan eylemleri geri alma yeteneğine sahip olmaz. Komut veya program bir geçmişi koruyorsa ve geri alma işlevine sahipse, belki de bu kullanılabilir, ancak kabuğun kendisi yapamaz.

Örneğin, çalıştırırsanız rm important_file.txt, dosya sistemi sürücüsünün dosya sistemindeki dosyanın bağlantısını "kaldırmasını" söyler. Kabuk işlemi gerçekleştirmez, sadece bunu rmyapar.

Kayıp bir dosyayı geri almak istemeniz durumunda, bunu yapmak mümkün olabilir, çünkü genellikle dosyayı silmek gerçekte kaldırmaz, ancak yalnızca referansı kaldırır. Bir süre sonra, diske diğer veriler kaydedildiği için dosyanın içeriğinin üzerine yazılacaktır, ancak bir süre orijinal dosya, dosyayı bulabilen ve "yeniden bağlayabilen" yardımcı programlar kullanılarak geri yüklenebilir.


1

Hayır, yok, ama eğer kök ayrıcalıklı bir dizinle uğraştığınızı ve bir şekilde berbat ettiyseniz, yapabileceğiniz tüm dosyaları bir USB Sürücüye veya SD Karta kaydetmek ve işletim sisteminizi sıfırlamak ISO dosyası (eğer hala sahipseniz, başka bir tane çevrimdışı olabilirsiniz ...). Bir şeyi sildiyseniz, paketin dediği gibi , dosya verilerini dosya adına bağlamak ve dosya içeriklerinin kaydedilmesini sağlamak için bir uygulama indirin ( buradaki soruya bakın ). Daha ayrıntılı bir cevap için bize neyi yanlış yaptığınızı söyleyebilir misiniz?


1

Başkalarının söylediklerini tekrarlamayacağım, ama nereden geldiğini görebiliyorum. "Tehlikeli" komutları uygulamaya yönelik standart yaklaşımım, tüm değişkenlerin düzgün bir şekilde genişletilip genişletilmediğini görmek için her zaman yankılanmak olmuştur. Bazı özel örnekleri teklif edebiliyorsanız, daha fazla yardımcı olabiliriz.

Örneğin, aşağıdaki gibi bir durumda:

for i in $(cat /my/file); 
do 
   echo "Now removing file $i using rm -f $i"
done

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.