bashシェルでコマンドを逆にすることは可能ですか?


12

bashシェルで実行されたコマンドを(単純な)やり直し/逆引きする可能性があるかどうか疑問に思っていましたか?(元に戻す)

アクションをやり直すctrl+のz組み合わせに似たものがありますか(たとえば、wordやLibreOfficeなど)?


8
短い答えはノーです。一部のコマンドは元に戻される可能性がありますが、一般的な取り消しはありません。
アルケマール

3
他の人が言ったように、undoコマンドがないので、オペレーティングシステム全体の最新のバックアップを保持することは非常に便利です。何か問題が発生した場合は、前の状態に戻すだけです。見てくださいrsnapshotを例えば
はArkadiusz Drabczyk

1
halt -pコマンドを元に戻す方法を見つけたい
スカペレン

3
@Joshuaユーザーのデータを破壊し、説明がないコマンドを使用してコメントを投稿することは、許容できない動作です。それは面白くなく、サイトを混乱させ、そして最も重要なこととして、それは危険です。二度とするな。
テルドン

2
私はshutdownコマンドを元に戻したいですlol ..そのような質問が1日に8つのアップ投票を得ることができるとは信じられません!!
MagExt

回答:


33

これbashは単なる実行環境であることを理解する必要があります。それはあなたが呼び出すコマンドを実行します-コマンドが何をするのかさえ知ることはシェルの仕事ではなく、あなたはあなたが望む実行可能ファイルを呼び出すことができます。ほとんどの場合、アンドゥが何をするのかさえ明確ではありません-例えば、映画を「アンプレイ」できますか?電子メールを「送信解除」できますか?たとえば、「実行中のFirefoxを元に戻す」とはどういう意味ですか?閉じてもかまいませんが、ブックマーク、ダウンロード、履歴は同じではありません。

コマンドを実行すると、コマンドは何でも実行されます。あなたが何をしているかを知るのはあなた次第です。これは、個々のコマンドに「元に戻す」機能がないことを意味するわけではないことに注意してください。

たとえば、mv何かを上書きしない限り、元の場所にファイルを戻すだけで簡単に元に戻すことができます。そのため-i、上書きする前に確認するスイッチが存在します。技術的にcprm、何かが上書きされない限り、isの逆です(もう一度、-iそれについて尋ねられます)。rmより永続的で、ファイルを取り戻すには、実際に低レベルのハッキングを行う必要があります(そのためのツールがあります)。ファイルシステムをブラックボックスと見なした場合、技術的にはまったく不可能です(データの論理的および物理的レイアウトの詳細によってのみ、何らかの損傷制御が可能になります)。rm手段は、rmあなたが「ごみ箱」機能が必要な場合は、それだけで、実際のですmv事前に準備されたディレクトリ(および場合によっては、それを維持または空にするためのスケジュールされたサービス)に入れます-それについて特別なものはありません。ただし、-i削除する前にプロンプ​​トを表示するために使用できます。関数またはエイリアスを使用して-i、これらのコマンドに常に含めることができます。

ほとんどのアプリケーションは、さまざまな方法でデータ損失から保護しています。ほとんどの(〜すべての)テキストエディター~は、古いバージョンを戻す場合に備えて、最後にバックアップファイルを作成します。一部のディストリビューションでlsは、デフォルトでエイリアスされているため、非表示になっています(-B)が、それらは存在しています。アクセス許可を適切に管理することにより、多くの保護が与えられます。必要になるまでrootにならず、変更したくない場合は読み取り専用にしてください。「サンドボックス」環境があると便利な場合があります-コピーで物事を実行し、問題ないか確認してから、変更をマージ(または変更を破棄)します。chrootまたはlxc、スクリプトがディレクトリから脱出し、損害を与えることを防ぐことができます。

物事を一括して実行しようとする場合-たとえば、複雑なfindコマンド、whileループ、長いパイプラインなどが存在する場合、最初echoに実行するコマンドのみを作成することをお勧めします。次に、コマンドが適切に見える場合はecho、実際に削除して実行します。もちろん、自分が何をしているか本当にわからない場合は、最初にコピーを作成してください。現在のディレクトリのtarballを作成することがあります。

タールボールといえば、残念ながらタールボムとジップボムは非常に一般的です(適切なサブディレクトリなしでアーカイブを作成し、解凍するとファイルが散らばって混乱する場合)。展開する前に自分でサブディレクトリを作成することに慣れました(内容を一覧表示できましたが、私は怠け者です)。内容がサブディレクトリなしでアーカイブされた場合にのみ、サブディレクトリを作成するスクリプトを作成することを考えています。ただし、実際に発生した場合は、ls -lrt最新のファイルを見つけて、それらが属する場所に配置するのに役立ちます。私はこれを例として挙げました-プログラムには多くの副作用がありますが、シェルはそれを知る方法がありません(どうしてできますか?呼び出されている別のプログラムです!)間違いを避ける唯一の確実な方法は注意することです2回、1回実行)。

おそらく最も危険なコマンドは、ファイルシステムを処理するコマンドです:mkfs、fdisk / gdiskなど。ファイルシステムを完全に破壊する可能性があります(ただし、適切なフォレンジックソフトウェアを使用すると、少なくとも部分的なリバースエンジニアリングが可能になります)。コマンドを実行する前に、フォーマットするデバイスを常に再確認し、パーティションが正しいことを確認してください。


14

いいえ、Bashには「元に戻す」などというものはありません。ごめんなさい。そのため、コマンドを再確認するか、重要でないファイルで最初にテストする必要があります(可能な場合)。そして、あなたがルートとして物事をしている場合、トリプルチェック;)


1
Ctr + /は、bashターミナルの特定の制御コマンドに対して取り消しを実行しますが、すべてのコマンドが取り消し可能というわけではありません。
エリックレシンスキー

@EricLeschinski参考にしていただけますか?
エラティエル

このページの返信コメントに埋もれています:skorks.com/2009/09/bash-shortcuts-for-maximum-productivity動作を確認するには、ターミナルにいくつかの単語を入力します。カーソルを文字の上に左に移動し、文字の下で削除するにはCtrl-dを押し、次にCtrl + /を押して削除を取り消します。
エリックレシンスキー

1
ああ、しかしそれはコマンドを元に戻すこととは根本的に異なるものです。でファイルを削除すると、ファイルはrmなくなってしまい、ファイルは消滅し、故人になり、もはや存在せず、元ファイルになります(Monty Pythonアラート)。今、その親sは悲しみに泣き、あなたはあなたの行為を取り消すことができません。あなたが話しているのは、入力の取り消しや文字の削除です。これはターミナルエミュレータの機能だと思います。私はちょうどターミネーターでそれを試したところ、それは動作します。別のコンソール(私の場合はCtrl + Alt + F1)に切り替えても機能しません。
エラティエル

ターミナルコマンドエントリの取り消しと、実行後のターミナルコマンドの取り消しがあります。前者を探してここに来ました。
エリックレシンスキー

11

いいえ、一般的な取り消しはありませんが、一部の結果は他の結果よりも可逆的です。たとえば、rm基本的に2つの目的に使用されます-混乱を回避し、新しいファイル用にスペースを解放します。少し運が良ければextundelete、次のようなツールを使用してファイルの内容を取得できます。実行すると、ファイルの先頭へのポインタのみが上書きされるためですrm。オペレーティングシステムがそのスペースを再利用すると、コンテンツは上書きされます(ミリ秒または数年後に発生する可能性があります)。なぜなら、この機能のため、rm途中に落ちるスケール多かれ少なかれ破壊的であるシステム。一方ではゴミがありますシステムは、データをすぐに失うリスクなしに混乱を回避する方法を提供します(元に戻すは簡単なので)。さらに保守的なのは、1回書き込み、多くの読み取り(「WORM」)システムであり、書き込みシステムがデータを自由に削除または上書きすることはできません。スケールのもう一方の端には、ポインターに加えてファイルの内容を(通常は複数回)上書きするシュレッディングシステムがあります。その時点では、データを回復するテクノロジーはおそらくまだ存在していません(おそらく存在しないこともあります)。

したがって、最も使用されている特定のツール(rm)が唯一の選択肢ではないことを確認できますが、ほとんどの人が満足していると思われるトレードオフを提供します。

  • ファイルポインターの削除は非常に高速で、ディスクの劣化にはほとんど寄与しません。
  • 高度に自動化されたシステムでスペースが不足する可能性が低い
  • 非常に控えめだがゼロではないプライバシー保護を提供し、逆に回復の保証を提供する
  • 複雑さが低いため、バグや予期しない動作の可能性が低い

ツールのトレードオフが受け入れられない場合は、見て回ってください。あなたに合った決定を下すツールがそこにある可能性があります


3
質問に対処するこの回答の唯一の部分は、最初の行です
アルバロ

sysadminの観点から、物事がそのようになっている理由を説明しようとしています。
l0b0

9

「元に戻す」機能を提供するアプリケーションは、実行されたアクションの履歴と、アクションを逆にする方法またはオブジェクトの状態のスナップショットを保持して、以前の状態を復元します。シェルで実行されるコマンドは、直接アクションを実行するか、コマンドを実行してアクションを実行します。

シェル自体には、実行されたコマンドまたはプログラムに起因するアクションを取り消す機能はありません。コマンドまたはプログラムが履歴を保持し、元に戻す機能を持っている場合、おそらくそれを使用できますが、シェル自体は使用できません。

たとえば、を実行するrm important_file.txtと、ファイルシステム上のファイルを「リンク解除」するようにファイルシステムドライバーに指示します。シェルはアクションを実行せず、実行するコールのみを呼び出しますrm

通常、ファイルを削除しても実際には削除されず、参照が削除されるだけなので、失われたファイルの削除を取り消す場合は、削除できる可能性があります。しばらくすると、ファイルの内容は他のデータがディスクに保存されるときに上書きされますが、しばらくの間、それを見つけて「再リンク」できるユーティリティを使用して元のファイルを復元できます。


1

いいえ、ありませんが、ルート特権ディレクトリをいじって何かを台無しにした場合、最善の策は、可能なすべてのファイルをUSBドライブまたはSDカードに保存し、オペレーティングシステムをリセットすることですISOファイル(まだ持っている場合は別のファイルをオフラインにできます...)。何かを削除した場合は、wraethが言ったように、ファイルデータをファイル名に再リンクし、ファイルの内容を保存するためのアプリケーションをダウンロードします(こちらの質問をご覧ください)。より詳細な回答については、間違ったことを教えてください。


1

私は他の人が言ったことを繰り返しませんが、あなたがどこから来ているのかを見ることができます。「危険な」コマンドを実行するための私の標準的なアプローチは、すべての変数が適切に展開されるかどうかを確認するために常にそれらをエコーすることです。特定のインスタンスを引用できる場合は、さらにサポートできる場合があります。

たとえば、次のような状況では:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.