対話型コマンドの問題を解決したいのですが、次のことをしたいと思います。
- バッファリングやラインバッファリングなしで元の色で画面に印刷された出力を表示します。詰まった-buffered,) コマンドが生成するためです。
このようなものを使用すると、(この設定の一部が不可能になる可能性があることを認識して、次の設定に置き換えます。)tee
このコマンドの出力をファイルに同時にリダイレクトして保存できます。つまり、歪みはありません(たとえば、次を渡すなど)。ANSIエスケープシーケンス正しく処理するのではなく、生データとして) - 生成されたログファイルの色。- また、次のコマンドを使用して
tee
このコマンドの出力をファイルにリダイレクトします。 - 実行時にそのコマンドの色で出力を表示する
- 生成されたログを汚染しません。ANSIエスケープシーケンス - つまり、端末に表示した後、出力から削除しますが、今後ログファイルに保存します。
通常、tee -a
ここにログインしようとしているのと同じ種類のコマンド出力を使用するのは私にとって魅力的です。一部パイプラインで私が出会った奇妙なコーナーケースは、これらの正常でtee
合理的な動作を破るように見えました。私は一つ作った少量以前に同様の問題を経験した人がいるかどうかを調べて解決策を提案しましたが、私が見つけた関連資料はすべて次のとおりです。
- シェルコマンドの出力をバッファリングされていない状態にするにはどうすればよいですか? - スタックオーバーフロー
- Tシャツに配管するときに色を保存する - スーパーユーザー
- パイプラインでバッファリングをオフにする
- ジャンク文字のないスクリプトコマンド
- スクリプト出力から制御文字(コンソールコード/色付き)を削除する
- Unix "script"コマンドの出力形式:バックスペース、改行、削除された文字を削除しますか? - スタックオーバーフロー
- インタラクティブスクリプトでティーとリアルタイム印刷ドア - Think Tank 101 - CC著作権ベースのQ&A共有プラットフォーム
しかし、これらのリソースのどれもかなり十分なヒントが与えられたら、私はそれを使用して、私が望むものに合うことをほぼ私が望む限り早く編むことができると思いました。良い - ついに助けが必要なログを生成できる人に転送できます。探すもちろん、彼らにもいくつかのものがあります。
私は持っています試験を終えた私が読んだことには、unbuffer
- と - に基づいたいくつかの異なるアドバイスがあり、この質問を書き始める前にいくつかのオファーを検討していましたが、まだ最後のアドバイスを実行していません。私はOS X v10.11.6 "El Capitan"を使用しています。問題を解決するコマンドは次のとおりです。script
stdbuf
/usr/bin/bash
HOMEBREW_BUILD_FROM_SOURCE=1 brew upgrade -vd --build-from-source mailutils
brew
ホームブルーパッケージマネージャソースからビルドしてアップグレードしようとしているMailutilsのバージョンはv3.3です(現在はv3.2を使用しています)。深い完全に変えるのは疑問その他それを注文する返品パイプラインの一部として使用すると、チャンクバッファリングされた出力が生成されます(私が理解している場合)。正しく、するどのシェルコマンドを実行すると、パイプ自体を設定するとブロックバッファリングが発生する可能性があると言われていますが、問題は解決しません。ここで取得したいログで目的の結果を得るには、どのツールを使用できますか?
ベストアンサー1
プロセスの置き換え1変えようscript
これがタイプスクリプトに記載されている内容です。
エスケープシーケンスが削除されたログを作成する代わりに、任意のコマンドを使用してそれらを削除するスクリプトを実行できます。比較的新しいバージョンのmacOSやFreeBSD以外のシステムでは、実装ごとにサポートするオプションが異なるため、コマンドが若干異なります。詳しくは下記をご覧ください。script -q >(./dewtell >>outfile) brew args...
script -aq outfile brew args...
./dewtell
script
これまでの話(代替ソリューションを含む)
あなたのソリューション
コマンドはスクリプトやbrew
他のいくつかの異なる出力生成プログラムを子プロセスとして実行し、出力にパイピングすると出力(少なくとも一部の子プロセス)がバッファリングされ、端末に表示されません。リアルタイム。./configure
make
brew
tee
brew args... 2>&1 | tee -a outfile
あなたは見つけました。script
以下を実行してscript -aq
問題を解決しました。標準出力ターミナル2-k
、自分の入力を録音するには、次のようにすることもできます。端末に鳴らずに入力しても。もっと探すドゥテルテの拡張版~のGillesのPerlスクリプト到着ファイルからエスケープシーケンスを削除する生成されたTypeScriptを効率的に整理し、必要なものに変換します。
Gillesの元のスクリプトとdewtellの拡張バージョンの違いは、両方に色の変更を指定することを含みますが、これらに限定されないエスケープシーケンスを削除しますが、dewtellのスクリプトはキャリッジリターン(および出力でマークされています$'\r'
)も削除しますするということです。バックスペース文字(およびの出力に表示される)と削除されたように見える文字(存在する場合)で表示されます。^M
vim
cat -v
$'\b'
^H
vim
cat -v
特定のPerl実装に関する問題
スクリプトに「比較的新しい」Perlインタプリタが必要だと報告しました。しかし、新機能は必要ありません。use
そうでなければそれに依存しているようで、macOS 10.11.6 El Capitanを実行している私の友達がシステム提供のPerl 5.8.12で動作することを確認したので、最新バージョンが必要な理由(または場合)がわかりません。パールワン。期待した最大人々は自分が持っているPerlを使うことができます。
しかし、台本は失敗したMac m
OSの場合、この問題は。これにより、色付きのエスケープシーケンスフラグメントが出力に残ります。これらのシーケンスは一致できず、後で代替シーケンスが代わりに一致するためです。そして[@-~]
LC_COLLATE=C
LC_ALL=C
grep
sed
python
ruby
(?:\e\[|\x9b) [ -?]* [@-~]
\e.
perlbrew
、私はこのシステムにPerl 5.27.5、5.8.9、さらには5.6.2もインストールしました。誰もこの問題に遭遇しませんでした。
スクリプトを実行するために他の場所にインストールされているPerlインタプリタが本当に必要な場合や使用したい場合は、次のように/usr/bin/perl
変更できます。ハッシュスティック一番上の行は正しいパスを指します。または、/usr/bin/env perl
目的のperl
実行可能ファイルがパスに最初に表示されるかどうか、つまりperl
入力して押すと実行されるかどうかに変更できますEnter。あるいは、スクリプトのファイル名を最初の引数として使用することもできます。たとえば。/usr/local/bin/perl dewtell
代わりにインタプリタを明示的に呼び出します。./dewtell
元のタイプスクリプトを保存または交換する方法
TypeScriptからエスケープシーケンスを削除する必要がある一部のユーザーは、未処理の古いTypeScriptを維持したいと考えています。そのようなユーザーが名前付きTypeScriptを処理しdirty.log
、ここに出力を書きたい場合は、必要に応じて実行された他のコマンドを置き換えてclean.log
実行します。./dewtell dirty.log > clean.log
./dewtell
ドゥテルテの台本(または使用したい他のスクリプト)。
TypeScriptを「所定の位置」に変更するには、 に渡して-i
実行perl
します。perl -i.orig dewtell typescript
typescript
はで生成されたタイプスクリプトscript
、.orig
はバックアップファイルに使用されるサフィックス、dewtell
はPerlスクリプトです。あるいは、バックアップサフィックスが提供されていないため、元のファイルを削除する代わりに実行することもできます。これらの方法はすべてのPerlスクリプトには適用されませんが、入力を読み取り、このスクリプトに適用されます。perl -i dewtell typescript
<>
<>
パール側では-i
。
sponge
元のタイプスクリプトに変更を書き直しました。この方法も素晴らしいと信頼できる方法です。その他のユーティリティインストールされています。
エスケープシーケンスが記録されないようにする
残りの質問は、最初にエスケープシーケンスが削除されたログを作成する方法です。 〜のようにあなたは言う:
[T]これらすべてを単一のパイプで接続する方法もあるかもしれませんが、書く時点では他の意見や答えから方法がわかりませんでした。
パイプの代わりにプロセス置換を使用してください。
問題は、script
ほとんどの(すべての)システムでこれらの変換をサポートするオプションがないことです。script
書き込まれたファイルの名前はユーザーが指定した名前であるか、デフォルト値typescript
(標準出力ではない)なので、パイピングはscript
TypeScriptに書き込まれる内容には影響しません。
script
パイプ演算子()の右側にコマンドを配置してパイプします。|
到着これも良い考えではありません。これは、特にbrew
標準出力がパイプの場合、出力またはそのサブプロセスがバッファリングされて表示される必要があるときに表示されないためです。
この問題が解決されても、合理的に使用できる方法はありません。管路1このタスクを一緒にscript
完了します。
ただし、これはプロセスの交換によって行うことができます。3インチプロセスの交換1(またここで説明されています)、あなたはまたは。シェルは<(command...)
>(command...)
名前付きパイプ標準出力または入力としてそれぞれ使用してください。サブシェル~へcommand...
ランニング。テキストまたはは、名前付きパイプのファイル名に置き換えられます。<(command...)
>(command...)
置換--したがって、プログラムにパラメータとして渡すか、リダイレクトターゲットとして使用できます。
- 走るために
<(command...)
command...
良いその出力希望のファイルの内容です次から読む。4 - 走るために
>(command...)
command...
良い入力希望のファイルの内容ですに手紙を書く。4
すべてのシステムが名前付きパイプをサポートしているわけではありませんが、ほとんどはサポートしています。すべてのシェルがプロセスオーバーライドをサポートしているわけではありませんが、Bashはそれをサポートしますが、Bashバージョンはそれをサポートできるシステムで実行され、POSIXモードがシェルからオフになっている限り、そのサポートは無視されません。強く打つ通常特に、リモートで最新のオペレーティングシステムを使用している場合は、プロセスの交換にアクセスできます。 Mac OS X 10.4.11 Tiger(PPC)システムでも"$BASH_VERSION"
プロセス2.05b.0(1)-release
の交換が正常に機能します。
script
最新のmacOSシステムでs構文を使用するときにこれを行う方法は次のとおりです。
これはmacOS 10.11 El Capitanシステムで動作し、以下を介して機能します。対応するマンページ、すべてのmacOSシステムこれは少なくともmacOS 10.9 Mavericksに戻ります。おそらく前:
script -q >(./dewtell >>clean.log) brew args...
ユーザー入力を含む端末に記録されたすべての内容を記録します。それがあなたに再びエコーされるとつまり、端末に表示される場合、通常はそうです。自分の入力を記録したい場合現れなくても、これは通常パスワードを入力したときに発生するため、あなたの答え-k
、オプションを追加:
script -kq >(./dewtell >>clean.log) brew args...
どちらの場合も、./dewtell
実行するコマンドで置き換えます。ドゥテルテの台本または、出力をフィルタリングするために使用したい他のプログラムまたはスクリプト、clean.log
これには、typescriptに書き込まれるファイル名(エスケープシーケンスを省略)が含まれており、5には実行中のコマンドとその引数が含まれています。brew args...
ログに上書きまたは追加
上書きしたい場合clean.log
ファイルに追加し、. を使用する代わりに、プロセス置換によって実行されるコマンドによって実際のファイルが書き込まれるため。>clean.log
>>clean.log
>
>>
>(
)
>>(
notを使用しないでください>(
。構文エラーであり、プロセス置換がリダイレクトを意味しないため、意味があり>
ません>(
。
この場合、ログファイルを上書きしないよう-a
に転送しないでください。このファイルは単に開かれます。script
名前付きパイプ追加モード - 通常の書き込み用に開くのと同じ効果があります。次に上書きまたは追加します。clean.log
、まだサブシェルで使用するか、使用するかによって異なります。>clean.log
>>clean.log
同様に、内部的に(またはどこでも)>&
orを使用したり追加したりしないでください&>
。エラーや警告が生成されたら、作成するのではなく確認したいと思うからです。2>&1
>(
)
./dewtell
clean.log
。このscript
コマンドは、TypeScriptに標準エラーのテキストを自動的に含めます。このために特別な作業を行う必要はありません。
他のオペレーティングシステムで
〜のようにあなたの答え説明する:
[S]
script
このコマンドの一部のバージョンは構文が異なります。付属のバージョンはOS X / macOS用ですので、必要に応じて調整してください。
GNU/Linux
ほとんどのGNU / Linuxシステムは、script
次に提供する実装を使用します。ユーティリティLinux。シェルを起動する代わりに特定のコマンドを実行するには、その-c
オプションを使用してコマンド全体を次のように渡す必要があります。単一のコマンドラインパラメータto でscript
囲む場合は、引用符で囲んで実行できます。これは、最新のmacOSシステムのバージョンとは異なりますscript
。このバージョンでは、出力ファイル名の後に配置された複数の引数でコマンドを自然に渡すことができます(などのオプションなし-c
)。
だからDebian、Ubuntu、Fedora、CentOS、その他のほとんどのGNU/Linuxシステム、次のコマンドを使用できます(brew
コマンド6がある場合、またはそれを実行して変換された出力を記録したいコマンドに置き換えます)。
script >(./dewtell >>clean.log) -qc 'brew args...'
script
システムと同様に、GNU/Linux でロギングの開始および終了方法に関する追加のメッセージを含める-q
場合は削除します。script
このオプションを使用しても、-q
このバージョンにはscript
実行が開始された時点を示す行が上部に含まれていますが、表示されません。あなたその行はいつ書かれたかについての情報を書いたり表示したりしません。停止ランニング。
選択の余地がない-k
。端末に表示されるテキストのみが記録されます。7
FreeBSD
macOSのコマンドはscript
FreeBSDから始まります。すべてのバージョンは-a
上書きの代わりに追加をサポートしています(ただし、前述のように、プロセス置換を使用して名前付きパイプに書き込むときに追加することはできません)。-a
以下を含む唯一のオプションです。プリBSD 2.2.5。オプション-q
は次のとおりです。FreeBSD 2.2.6に追加されました。オプション-k
は次のとおりです。FreeBSD 2.2.7に追加されました。
戻るFreeBSD 2.2.5経由、これはscript
特定のコマンドを与えることを許可しませんが、変数が設定されていない場合は、通常、SHELL
環境変数によって与えられたユーザーシェルを常に実行します。/bin/sh
FreeBSD 2.2.6からスタートscript
、シェルの代わりに実行されるコマンドラインに特定のコマンドを提供できます。
script
したがって、最新バージョンのFreeBSD(現在の一般的なバージョンを含む)は、コマンドを呼び出す方法で最新のmacOSシステム(ユーザーシステムなど)に似ています。同様に、以前のバージョンのFreeBSDは以前のバージョンのmacOSと似ています(下記参照)。
perl
最新バージョンではFreeBSDベースシステムの一部ではなく、そのようなこともbash
ありません。どちらもpkg install perl5 bash bash-completion
パッケージ(withなど)またはポートを使用して簡単にインストールできます。 FreeBSD が提供するシステムは、/bin/sh
プロセス置換をサポートしません。
以前のバージョンのmacOSや多様性が劣るその他のシステムscript
私はMac OS X 10.4 Tigerでテストしましたscript
。ただオプション-a
。-q
またはを許可しません-k
。 GNU / Linuxシステムのutil-linuxバージョンと同様に、typescript 7の端末に表示されているキーストロークのみが含まれています。
少なくとも各macOSバージョンの信頼できるドキュメントソースが見つかるまでscript
(私が知る限り)10.9 マーベリックスのマンページオンラインで簡単に入手できます)macOSユーザーには次のことをお勧めします。man script
script
そのコマンドが許可する構文、デフォルトで動作する方法、およびサポートされているオプションを確認してください。私のような古いバージョンのmacOSでは、次のコマンドを使用できます。
script >(./dewtell >>clean.log)
brew args...
exit
これは以下にも当てはまります。script
多くのオプションをサポートしていない他のオペレーティングシステム、または他のオプションをサポートしていますが、そのオプションを使用したくないオペレーティングシステムで。これscript
は、シェルを起動してシェルに書き込む必要があるすべてのコマンドを実行してからシェルを終了する従来の方法です。
コマンドを偽装する醜いハッキングはシェルです。
シェルの新しいインスタンスではなく単一のコマンドを実行するために実際にそれを使用する必要がある場合は、時々醜いscript
ハッキングを使用することがあります。実行したいコマンドが実際にシェルだと思うように欺くことができます。ただし、これを行う前に2回考える必要があります。SHELL=your-command script outfile
your-command
実際には、SHELL
環境変数を参照して使用している実際のシェルを確認し、残念ながら不幸な動作が発生します。
さらに、複数の単語で構成されるコマンド(たとえば、1つ以上の引数を渡すコマンド)の場合、これは簡単ではありません。以前に同じ行に書いた場合、値は環境に正常に渡されますが、最初の単語だけでなく文字列全体がコマンド名として使用され、コマンドの代わりに引数が渡されません。他のすべての単語は渡されました。SHELL='brew args...'
script
brew args...
script
SHELL
以下で実行されるシェルスクリプト(run-brew
または必要に応じて呼び出し)を作成することで、この問題を解決できます。brew
args...
を選択し、それを環境変数の値として渡しますSHELL
。run-brew
シェルスクリプトの生成後にコマンドを実行すると、script
次のようになります。
SHELL=run-brew script >(./dewtell >>clean.log)
上記の理由により、SHELL
実行中の操作が重要ではないか、使用しないことがわからない限り、コマンド名を割り当てる方法を使用しないことをお勧めしますSHELL
。 Homebrewはかなり複雑な作業をたくさんしているので、実際にrun-brew
そのようなスクリプトを実行しないことをお勧めします。 (長くて複雑なbrew
コマンドをスクリプトに入れるのに問題はありませんrun-brew
。ただSHELL=run-brew
makeを使ってscript
実行してください。)
しかし、上記のテクニックをテストするために単純なプログラムで使用すると、このアプローチはやや便利です。brew args...
技術テストとデモンストレーション
長いコマンドよりも複雑なコマンドに対してこれらの方法のいくつかを試してみると便利ですbrew
。私はそうだったことを知っています。
デモプログラム/テスト入力ジェネレータと使用されるテスト方法
私は標準エラーに書き、標準出力からユーザーの名前を求めるメッセージを表示し、標準入力から読み取った後、標準出力にグリーティングを書き、ユーザーを色名で表示する簡単なインタラクティブPerlスクリプトを作成しました。
#!/usr/bin/perl
use strict;
use warnings;
use Term::ANSIColor;
print STDERR $0, ": warning: this program is boring\n";
print "What's your name? ";
chomp(my $name = <STDIN>);
printf "Hello, %s!\n", colored($name, 'cyan');
呼んでcolorhi
入れるドゥテルテの台本、私はそれを呼ぶdewtell
。
私のテストでは、#!/usr/bin/perl
両方のスクリプトを置き換えました。8システム提供 Perl 5.22.1 および提供バージョン 5.6.2 および 5.8.9 を使用し、FreeBSD 11.1-RELEASE-p3 および提供 Perl 5.24.3 およびバージョン 5.6.2、5.8.9 および 5.27.5 を使用した Ubuntu 16.04 LTSでテストしました。 ; Mac OS#!/usr/bin/env perl
perlbrew
pkg
perlbrew
perlbrew
各Perlバージョンについて、以下に説明するテストを繰り返しました。まず、システムが提供するバージョン9をテストし、一時的に使用して、提供されたperlbrew use
各バイナリが最初に表示されるようにしました。テスト中のシステムへのコマンド)。perlbrew
perl
$PATH
perlbrew use 5.6.2
友人が元のhashbangラインを使用してmacOS 10.11.6 El Capitanでテストした結果、システムによって提供されたperl 5.18.2を使用し、他のインタプリタはテストしませんでした。このテストでは、FreeBSDでテストしたときに実行したのと同じコマンドを使用します。
Mac OS X 10.4.11 Tigerでシステム提供のPerlを除いて、これらのテストはすべて成功しました。、以下の例に示すように、前に詳しく説明したように、正規表現の文字クラスに関連する奇妙なエラーが原因で失敗しました。
Ubuntuから
スクリプトを含むディレクトリで、Ubuntuシステムで次のコマンドを実行して、エスケープシーケンスと入力できるバックスペース文字を含むTypeScriptを作成します。
printf 'Whatever header you want...\n\n' >dirty.log
script dirty.log -aqc ./colorhi
私はそれを入力し、それがEliah
良い考えのように振る舞い、バックスペースキーで削除し、と入力しましたBob from accounting
。それからそれを押したところ、Enter色は私を歓迎しました。次に、次のコマンドを実行します。それぞれエスケープシーケンスなしで、実際の名前を表示せずにタイプスクリプトを作成し、まったく同じように対話します(入力と消去を含むEliah
)。
printf 'Whatever header you want...\n\n' >clean.log
script >(./dewtell >>clean.log) -qc ./colorhi
vim
制御文字を記号的に表示しcat -v
、明るいテキストまたはカラーテキストの利点を提供します。表示されるバッファは次のとおりですが、view dirty.log
制御文字はイタリック体で表示され、目に見えます。
Whatever header you want...
Script started on Thu 09 Nov 2017 07:17:19 AM EST
./colorhi: warning: this program is boring^M
What's your name? Eliah^H ^H^H ^H^H ^H^H ^H^H ^HBob from accounting^M
Hello, ^[[36mBob from accounting^[[0m!^M
バッファの様子は次のとおりですview clean.log
。
Whatever header you want...
Script started on Thu 09 Nov 2017 07:18:31 AM EST
./colorhi: warning: this program is boring
What's your name? Bob from accounting
Hello, Bob from accounting!
結果は、タイムスタンプを除いてテストされたすべてのインタプリタに対して同じです。
FreeBSD(およびmacOS 10.11.6 El Capitan)
次のコマンドを使用してビルドしたことを除いて、Ubuntuと同じ方法でFreeBSDでテストしましたdirty.log
。
printf 'Whatever header you want...\n\n' >dirty.log
script -aq dirty.log ./colorhi
次のコマンドを使用して以下を生成しますclean.log
。
printf 'Whatever header you want...\n\n' >clean.log
script -q >(./dewtell >>clean.log) ./colorhi
これは私の友人がmacOS 10.11でテストしたときに実行したのと同じコマンドです。Eliah
、エクスポートされた入力は私/入力とは少し異なりますが、Bob from accounting
まだ名前を入力してバックスペースで削除し、別の名前に置き換えます。したがって、バックスペースキーの名前と数を除いて、出力は似ています。
4つのPerl実装はすべてFreeBSDでテストされており、1つ(システム提供)の実装はmacOS 10.11でテストされており、どちらも予想される出力をdirty.log
示しています。clean.log
FreeBSDの結果をUbuntuの結果と比較すると、タイムスタンプがないことが異なります。これは、削除を示すすべてのバックスペースおよびバックスペース文字と同様に、すべてのエスケープシーケンスとキャリッジリターンが正常に削除されたため-q
です。clean.log
Mac OS X 10.4.11 タイガー
次のコマンドを使用してビルドしたことを除いて、UbuntuとFreeBSDと同じ方法で既存のTigerシステムでテストしましたdirty.log
。
printf 'Whatever header you want...\n\n' >dirty.log
SHELL=colorhi script -a dirty.log
次のコマンドを使用して以下を生成しますclean.log
。
printf 'Whatever header you want...\n\n' >clean.log
SHELL=colorhi script >(./dewtell >>clean.log)
システムscript
コマンドはサポートされていないため、-q
結果は次のようになります。(ㅏ)Script started
タイトルの後に行を追加(二)改行文字の後には、Script done
各タイプスクリプトの末尾に1行が追加されます。両方の行にはタイムスタンプが含まれています。それ以外の場合、結果はUbuntuとFreeBSDと同じです。ターコイズテキストを切り替えるためのシステム提供のエスケープシーケンスは完全に削除されませんでした。perl
。予想通り、関連する行は常にdirty.log
次のように表示されますvim
。
Hello, ^[[36mBob from accounting^[[0m!^M
システム提供のPerl 5.8.6では、これはclean.log
ディスプレイ6m
とその対応する行で0m
あり、削除する必要があります。
Hello, 6mBob from accounting0m!
インストールされているすべてのperlbrew
Perlに対して、すべてのエスケープシーケンスが正確かつ正しく削除され、UbuntuとFreeBSDで実行されているすべてのPerlインタプリタと同様に、行は次のようになりますclean.log
。
Hello, Bob from accounting!
ノート
1 そのマニュアルバッシュ2で動作します。多くの Bash ユーザーはメジャーバージョン 4 を使用しており、読み取りを好む。プロセスの交換、管路その他のトピック現在の Bash マニュアル。現在のバージョンのmacOSにはBash 3が付属しています。
2 標準エラーファイルやデバイスの種類に関係なく、ほとんど常にバッファリングされません。プログラムがファイル記述子2への書き込みをバッファリングできないという規則はありませんが、エラーや警告メッセージが発生したときに実際に確認して表示する必要があるため、そうしない強い伝統があります。別の言葉、プログラムが適切に閉じられていないか、開かれたファイル記述子をフラッシュせずに異常終了する場合も同様です。これは通常、プログラムがデフォルトで標準エラーへの書き込みをバッファリングするバグです。
3プロセス代替の使用名前付きパイプ、また〜として知られる先入選出、これはシェルのパイプ演算子と同じ一般的な目標を達成しますが、|
より一般的です。しかしそれにもかかわらずパイプです、私はそうは思わないパイプライン、私の考えでは、シェルの特定の構文構造とその動作を参照しているようです。
4ネームドパイプをファイルとして扱う場合、あなたはする必要があります、それならこれが実際に起こっていることです。
5"$COMMAND"
に登場するがあなたの答えコマンド全体を単一の引数として渡しますscript
(なぜなら二重引用符止める噴射)、次のコマンドを渡すことができます。script
複数のパラメータで。
6と同様にLinuxブルー、認めなければならないあなたは私に紹介。
7しかし、機密データを秘密に保つために、この動作に頼っている人は誰でもscript
自分のコマンド動作をテストし、結果のTypeScriptをチェックして保護する必要があるデータがないことを確認することをお勧めします。さらなるセキュリティのために、通常、画面に隠された文字を表示するエディタを使用するか、cat -v
。
#!/usr/bin/perl
示された実装を含む8に付属のバージョンは、colorhi
ほとんどのシステムで実行され、正しい操作を実行する必要があります。私は#!/usr/bin/env perl
それを自分のテストに使用しました。しかし、私の友人はあなたと同じOSを使用しています(オリジナルポスター)#!/usr/bin/perl
。これは、システムが提供するPerlが最小限の複雑さまたは潜在的な疑いで動作することを確認する目標を達成します。
9FreeBSDには、最も厳しい意味でシステムが提供するPerlはありません。まずインストールされたバージョンをテストしましたpkg
。