jawaban bermanfaat rici menjelaskan masalah dengan pendekatan asli dengan baik.
Namun, ada hal lain yang perlu disebutkan:
man
output berisi pemformatan karakter kontrol , yang mengganggu penelusuran teks .
Jika Anda menyalurkan ke col -b
sebelum menelusuri , karakter kontrol ini dihapus - perhatikan efek samping bahwa hasil penelusuran juga berupa teks biasa.
Namun, grep
bukan alat yang tepat untuk pekerjaan ini; Saya sarankan menggunakan awk
sebagai berikut untuk mendapatkan keterangan dari -O
:
man gcc | col -b | awk -v RS= '/^\s+-O\n/'
RS=
(pemisah input-record kosong) adalah idiom awk yang memecah input menjadi blok baris yang tidak kosong, sehingga mencocokkan opsi di awal blok tersebut memastikan bahwa semua baris berisi deskripsi opsi dikembalikan.
Jika Anda memiliki awk
khusus fitur POSIX seperti BSD/OSX awk
, gunakan versi ini:
man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'
Jelas, perintah seperti itu agak rumit untuk diketik, jadi temukan generic bash
fungsi manopt
di bawah ini, yang mengembalikan deskripsi opsi yang ditentukan untuk perintah yang ditentukan dari man
halaman . (Mungkin ada positif dan negatif palsu, tetapi secara keseluruhan berfungsi dengan baik.)
Contoh:
manopt gcc O # search `man gcc` for description of `-O`
manopt grep regexp # search `man grep` for description of `--regexp`
manopt find '-exec.*' # search `man find` for all actions _starting with_ '-exec'
bash
fungsi manopt()
- tempatkan di ~/.bashrc
, misalnya:
# SYNOPSIS
# manopt command opt
#
# DESCRIPTION
# Returns the portion of COMMAND's man page describing option OPT.
# Note: Result is plain text - formatting is lost.
#
# OPT may be a short option (e.g., -F) or long option (e.g., --fixed-strings);
# specifying the preceding '-' or '--' is OPTIONAL - UNLESS with long option
# names preceded only by *1* '-', such as the actions for the `find` command.
#
# Matching is exact by default; to turn on prefix matching for long options,
# quote the prefix and append '.*', e.g.: `manopt find '-exec.*'` finds
# both '-exec' and 'execdir'.
#
# EXAMPLES
# manopt ls l # same as: manopt ls -l
# manopt sort reverse # same as: manopt sort --reverse
# manopt find -print # MUST prefix with '-' here.
# manopt find '-exec.*' # find options *starting* with '-exec'
manopt() {
local cmd=$1 opt=$2
[[ $opt == -* ]] || { (( ${#opt} == 1 )) && opt="-$opt" || opt="--$opt"; }
man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"'
}
fish
implementasi manopt()
:
Dikontribusikan oleh Ivan Aracki.
function manopt
set -l cmd $argv[1]
set -l opt $argv[2]
if not echo $opt | grep '^-' >/dev/null
if [ (string length $opt) = 1 ]
set opt "-$opt"
else
set opt "--$opt"
end
end
man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"'
end
Saya menduga Anda tidak benar-benar menggunakan grep $'-O\n'
, melainkan beberapa flag yang dikenali oleh grep
.
Dari sudut pandang grep, Anda hanya memberikan argumen, dan argumen tersebut dimulai dengan -
jadi itu akan ditafsirkan sebagai pilihan. Anda perlu melakukan sesuatu seperti grep -- -O$
untuk menandai akhir daftar opsi secara eksplisit, atau grep -e -O$
untuk secara eksplisit menandai pola sebagai pola. Bagaimanapun, Anda tidak dapat menyertakan baris baru dalam suatu pola karena pola grep sebenarnya adalah daftar pola yang dipisahkan oleh karakter baris baru, sehingga argumen $'foo\n'
sebenarnya adalah dua pola, foo
dan string kosong, dan string kosong akan cocok dengan setiap baris.
Mungkin Anda mencari bendera -e
karena itu menggunakan pola sebagai argumen, dan memberinya baris baru sebagai argumen akan menyebabkan grep menemukan setiap baris di seluruh file.
Untuk sebagian besar program GNU, seperti gcc, Anda mungkin menemukan info
antarmuka lebih mudah dinavigasi, karena menyertakan tautan referensi, daftar isi, dan bahkan indeks. info gcc
dokumen menyertakan indeks opsi, yang sangat berguna. Dalam beberapa distribusi linux, dan agak mengejutkan karena mereka menyebut diri mereka distribusi GNU/linux, perlu menginstal info
secara terpisah paket meskipun man
file didistribusikan dengan perangkat lunak dasar. Paket debian/ubuntu berisi gcc info
file disebut gcc-doc
, Misalnya. (Penggunaan -doc
akhiran ke nama paket cukup umum.)
Dalam kasus gcc
Anda dapat dengan cepat menemukan opsi menggunakan perintah seperti:
info gcc "option index" O
atau
info gcc --index-search=funroll-loops
Untuk program dengan opsi lebih sedikit, biasanya cukup baik menggunakan -O
info opsi:
info -O gawk