web-dev-qa-db-ja.com

コマンドからログファイルを作成する方法(エイリアスを使用)

呼び出しは、単に端末に入力されたudです。 udは、私の~/.bash_aliases

alias ud='Sudo apt-get update && Sudo apt-get upgrade -y && Sudo apt-get dist-upgrade -y && Sudo apt-get clean -y'

クイック検索の後、ログファイルの保守に推奨される次の方法を見つけました(make install元の投稿から):

$ make install > file.txt 2>&1

ここに問題があります。これを自分のニーズに合わせても、次の構文から期待される結果が得られません。

$ ud > file.txt 2>&1

私が得るのは、コマンドが画面上の標準出力に対して実行され、0バイトのテキストファイルが生成されるということです。私が達成したいのは、lsに対して次のような出力テキストファイルを作成することです。

$ ls > file.txt 2>&1

何が起こっているのかを誰かに説明してもらえますか?

最後に、次の結果は説明できません。

$ $(ud) > file.txt
La commande « Ign » est introuvable, vouliez-vous dire :
 La commande « tgn » du paquet « tgn » (universe)
Ign : commande introuvable

$ echo $(ud) > file.txt
1
Tfb9

サブシェルでコマンドを実行します。

(ud) > file.txt 2>&1

これには、サブシェルで実行するエイリアスudにコマンドがあり、すべてのコマンドのSTDOUTおよびSTDERRを親シェルにリダイレクトして、すべてのコマンドのSTDOUTおよびSTDERRを同じにリダイレクトできるようにします。親シェルから一度にファイルします。

または、@ steeldriverが示唆したように、すべてのコマンドがグループ化され、STDOUTとSTDERRが一度にリダイレクトされるように、エイリアスを次のように設定することもできます。

alias ud='{ Sudo apt-get update && Sudo apt-get upgrade -y && Sudo apt-get dist-upgrade -y && Sudo apt-get clean -y ;}'

これで、コマンドを次のように実行できます。

ud > file.txt 2>&1

さて、あなたが間違っていたことを理解しましょう:

エイリアスを次のように設定しました。

alias ud='Sudo apt-get update && Sudo apt-get upgrade -y && Sudo apt-get dist-upgrade -y && Sudo apt-get clean -y'

実行すると、次のようになります。

ud > file.txt 2>&1

最後に成功または失敗したコマンドのSTDOUTおよび(または)STDERRのみがfile.txtにリダイレクトされ、以前のすべてのコマンドが実行され、そのコマンドの終了コード(成功&&)に応じて次のコマンドが実行されます。したがって、あなたの場合、すべてのコマンドが成功し、Sudo apt-get clean -y.debファイルを/var/cache/apt/archivesからすべて削除し、STDOUTを表示せずに空のファイルを取得しました。

2
heemayl