いくつかのシェル組み込みコマンドは乏しいが、完全なマニュアルに示す有してもよいことが、それは本当だが-特にそれらのためにbash
あなたがGNUシステム上での使用のみになりそうだという固有の組み込みコマンドを信じていない、原則として(GNUの人々 、man
および独自のinfo
ページを好みます) -POSIXユーティリティの大部分-シェル組み込みまたはその他-POSIX Programmer's Guideに非常によく表されています。
これは私の下部からの抜粋ですman sh
(おそらく20ページほどか...)
それらのすべてがそこにあり、他はそのような言及していないset
、read
、break
...よく、私はそれらすべてに名前を付ける必要はありません。しかし(1P)
、右下にあることに注意してください-それはPOSIXカテゴリ1マニュアルシリーズを示しています-それらはman
私が話しているページです。
パッケージをインストールするだけでいいのでしょうか?これはDebianシステムにとって有望に見えます。一方でhelp
便利です、あなたはそれを見つけることができれば、あなたは間違いなくそれを取得する必要POSIX Programmer's Guide
シリーズを。これは非常に役立ちます。また、構成ページは非常に詳細です。
それを除けば、シェルの組み込みコマンドはほとんどの場合、特定のシェルのマニュアルの特定のセクションにリストされています。zsh
、たとえば、man
そのための完全な個別のページがあります- (私はそれが巨大であるものzsh
を含めzshall
て8または9かそこらの個々のページで合計すると思います)
grep
man
もちろん次のことができます。
man bash 2>/dev/null |
grep '^[[:blank:]]*read [^`]*[-[]' -A14
read [-ers] [-a aname] [-d delim] [-i text] [-n
nchars] [-N nchars] [-p prompt] [-t timeout] [-u
fd] [name ...]
One line is read from the standard input, or
from the file descriptor fd supplied as an
argument to the -u option, and the first
word is assigned to the first name, the sec‐
ond word to the second name, and so on, with
leftover words and their intervening separa‐
tors assigned to the last name. If there
are fewer words read from the input stream
than names, the remaining names are assigned
empty values. The characters in IFS are
used to split the line into words using the
same rules the shell uses for expansion
...これは、シェルman
ページを検索するときに使用していた操作にかなり近いものです。しかし、ほとんどの場合help
はかなり良いbash
です。
私はsed
最近、この種のものを処理するスクリプトに取り組んでいます 上の写真のセクションをつかんだ方法です。それは私が好きなよりもまだ長いですが、改善されています-そしてかなり便利かもしれません。現在のイテレーションでは、コマンドラインで指定された[a]パターンに基づいて、セクションまたはサブセクションの見出しに一致するテキストのコンテキスト依存セクションをかなり確実に抽出します。出力に色を付け、標準出力に出力します。
インデントレベルを評価することで機能します。通常、空白でない入力行は無視されますが、空白行に遭遇すると注意を払い始めます。別の空白行が発生する前に現在のシーケンスが最初の行よりも確実にインデントすることを確認するまで、そこから行を収集するか、スレッドをドロップして次の空白を待ちます。テストが成功すると、コマンドライン引数に対してリードラインを一致させようとします。
これは、一致パターンが一致することを意味します。
heading
match ...
...
...
text...
..そして..
match
text
..だがしかし..
heading
match
match
notmatch
..または..
text
match
match
text
more text
一致する可能性がある場合、印刷を開始します。一致する行の先頭の空白を、印刷するすべての行から削除します。したがって、インデントレベルに関係なく、その行が先頭にあるかのように印刷します。一致する行よりもインデントレベル以下で別の行に出会うまで印刷を継続します。したがって、セクション全体は、含まれる可能性のある/すべてのサブセクション、段落を含む、見出しの一致だけで取得されます。
したがって、基本的にパターンに一致するように要求すると、何らかの主題見出しに対してのみ一致し、一致する見出しのセクション内で見つかったすべてのテキストに色を付けて印刷します。最初の行のインデントを除いて、これは何も保存されません。したがって、非常に高速で\n
、実質的に任意のサイズの改行で区切られた入力を処理できます。
次のような小見出しに再帰する方法を見つけるのにしばらく時間がかかりました。
Section Heading
Subsection Heading
しかし、最終的に整理しました。
ただし、単純にするためにすべてをやり直す必要がありました。いくつかの小さなループがコンテキストを合わせるためにわずかに異なる方法でほとんど同じことを行う前に、再帰の手段を変えることで、コードの大部分を重複排除することができました。現在、2つのループがあります。1つは印刷で、もう1つはインデントをチェックします。両方とも同じテストに依存します。テストに合格すると印刷ループが開始され、失敗または空白行でインデントループが引き継がれます。
プロセス全体は非常に高速です。ほとんどの場合、/./d
空白以外の行を削除して次の行に移動するだけでなくzshall
、画面に瞬時にデータを入力した結果でさえもです。これは変更されていません。
とにかく、これは今のところ非常に便利です。たとえば、read
上記のことは次のように実行できます。
mansed bash read
...そして、ブロック全体を取得します。パターンは何でもかまいませんし、複数の引数を取ることもできますが、最初の引数は常にman
検索するページです。これが、私が行った後の出力の一部の写真です。
mansed bash read printf
...両方のブロックが全体として返されます。私はよく次のように使用します:
mansed ksh '[Cc]ommand.*'
...非常に便利です。また、取得SYNOPS[ES]
すると本当に便利になります:
ここで、あなたがそれを旋回させたいなら、それはそうです-あなたがそうしなくても私はあなたを責めません。
mansed() {
MAN_KEEP_FORMATTING=1 man "$1" 2>/dev/null | ( shift
b='[:blank:]' s='[:space:]' bs=$(printf \\b) esc=$(printf '\033\[') n='\
' match=$(printf "\([${b}]*%s[${b}].*\)*" "$@")
sed -n "1p
/\n/!{ /./{ \$p;d
};x; /.*\n/!g;s///;x
:indent
/.*\n\n/{s///;x
};n;\$p;
/^\([^${s}].*\)*$/{s/./ &/;h; b indent
};x; s/.*\n[^-[]*\n.*//; /./!x;t
s/[${s}]*$//; s/\n[${b}]\{2,\}/${n} /;G;h
};
#test
/^\([${b}]*\)\([^${b}].*\n\)\1\([${b}]\)/!b indent
s//\1\2.\3/
:print
/^[${s}]*\n\./{ s///;s/\n\./${n}/
/${bs}/{s/\n/ & /g;
s/\(\(.\)${bs}\2\)\{1,\}/${esc}38;5;35m&${esc}0m/g
s/\(_${bs}[^_]\)\{1,\}/${esc}38;5;75m&${esc}0m/g
s/.${bs}//g;s/ \n /${n}/g
s/\(\(${esc}\)0m\2[^m]*m[_ ]\{,2\}\)\{2\}/_/g
};p;g;N;/\n$/!D
s//./; t print
};
#match
s/\n.*/ /; s/.${bs}//g
s/^\(${match}\).*/${n}\1/
/../{ s/^\([${s}]*\)\(.*\)/\1${n}/
x; s//${n}\1${n}. \2/; P
};D
");}
簡単に言うと、ワークフローは次のとおりです。
- 空白ではなく、
\n
改行文字を含まない行は出力から削除されます。
\n
入力パターンスペースにewline文字が含まれることはありません。それらは編集の結果としてのみ持つことができます。
:print
と:indent
は、相互に依存する閉ループであり、\n
ewline を取得する唯一の方法です。
:print
のループサイクルは、行の先頭の文字が一連の空白で、その後に\n
改行文字が続く場合に始まります。
:indent
のサイクルは空白行で開始します-または、:print
失敗したサイクル行で開始します#test
が、出力から:indent
すべての先行ブランク+ \n
ewlineシーケンスを削除します。
- 一度
:print
、入力ラインにプルしていきますから始まり、量に空白を至るまでのストリップが重ね打ち翻訳し、そのサイクルの最初の行で見つかったとunderstrikeバックスペースエスケープカラーの端末エスケープに、とまでは結果を印刷#test
に失敗します。
:indent
開始する前に、h
インデントの継続( Subsection など)がないか古いスペースを最初にチェックし、#test
失敗し、最初の行に続く行が一致し続ける限り、入力を引き込み続け[-
ます。最初の行より後の行がそのパターンに一致しない場合は削除されます。その後、次の行も次の空白行まで削除されます。
#match
そして#test
2つの閉ループを橋渡しします。
#test
空白の先頭のシリーズが\n
、行シーケンスの最後のewlineが続くシリーズよりも短い場合に通過します。
#match
は、コマンドライン引数との一致を伴う出力シーケンスのいずれかにサイクル\n
を開始するために必要な先頭のewlinesを追加します。表示されないシーケンスは空になり、結果の空白行がに返されます。:print
:indent
:indent