Saya mengalami perilaku aneh ketika mencoba untuk membuka halaman manual di macOS. Misalnya, halaman manual Bash jelas memiliki kemunculan string NAME
:
$ man bash | head -5 | tail -1
NAME
Dan jika saya menerima karena name
saya mendapatkan hasil, tetapi jika saya menerima karena NAME
saya tidak:
$ man bash | grep 'NAME'
$ man bash | grep NAME
Saya sudah mencoba kata-kata huruf besar lain yang saya tahu ada di sana, dan mencari SHELL
hasil apa-apa selain mencari BASH
hasil.
Apa yang terjadi di sini?
Perbarui : Terima kasih atas semua jawaban! Saya pikir itu layak menambahkan konteks di mana saya mengalami ini. Saya ingin menulis fungsi bash untuk dibungkus man
dan dalam kasus-kasus di mana saya mencoba mencari halaman manual untuk sebuah shell bawaan, lompat ke bagian yang relevan dari halaman manual Bash. Mungkin ada cara yang lebih baik, tapi inilah yang saya dapatkan saat ini:
man () {
case "$(type -t "$1")" in
builtin)
local pattern="^ *$1"
if bashdoc_match "$pattern \+[-[]"; then
command man bash | less --pattern="$pattern +[-[]"
elif bashdoc_match "$pattern\b"; then
command man bash | less --pattern="$pattern[[:>:]]"
else
command man bash
fi
;;
keyword)
command man bash | less --hilite-search --pattern='^SHELL GRAMMAR$'
;;
*)
command man "$@"
;;
esac
}
bashdoc_match() {
command man bash | col -b | grep -l "$1" > /dev/null
}
sumber
man bash | grep NAME
bekerja seperti yang diharapkan.help
perintah bash untuk mendapatkan informasinya.help
hasilnya terlalu banyak. Lihathelp complete
vscomplete
bagian dalamman bash
, misalnya.Jawaban:
Jika Anda menambahkan
| sed -n l
ketail
perintah itu, untuk menampilkan karakter yang tidak dapat dicetak, Anda mungkin akan melihat sesuatu seperti:Artinya, setiap karakter ditulis sebagai
X
BackspaceX
. Pada terminal modern, karakter akhirnya ditulis sendiri (karena Backspace alias BS alias\b
alias^H
adalah karakter yang menggerakkan kursor satu kolom ke kiri) tanpa perbedaan. Tetapi dalam mesin tik tele-kuno, itu akan menyebabkan karakter muncul dalam huruf tebal karena mendapat tinta dua kali lebih banyak.Namun, pager suka
more
/less
mengerti format itu artinya tebal, jadi itu yang membuatroff
teks tebal.Beberapa implementasi manusia akan memanggil
roff
dengan cara bahwa urutan itu tidak digunakan (atau panggilan internalcol -b -p -x
untuk menghapusnya seperti dalam kasusman-db
implementasi (kecualiMAN_KEEP_FORMATTING
variabel lingkungan diatur)), dan tidak meminta pager ketika mereka mendeteksi output tidak pergi ke terminal (jadiman bash | grep NAME
akan bekerja di sana), tetapi bukan milik Anda.Anda dapat menggunakan
col -b
untuk menghapus urutan tersebut (ada tipe lain (_
BSX
) juga untuk garis bawah).Untuk sistem yang menggunakan GNU
roff
(seperti GNU atau FreeBSD), Anda dapat menghindari urutan yang digunakan di tempat pertama dengan memastikan-c -b -u
opsi diteruskangrotty
, misalnya dengan memastikan-P-cbu
opsi dilewatkan kegroff
.Misalnya dengan membuat skrip wrapper yang disebut
groff
mengandung:Anda menempatkan / usr / bin / groff di depan
$PATH
.Dengan macOS '
man
(juga menggunakan GNUroff
), Anda dapat membuatman-no-overstrike.conf
dengan:Dan sebut
man
sebagai:Masih dengan GNU
roff
, jika Anda mengaturGROFF_SGR
variabel lingkungan (atau tidak mengaturGROFF_NO_SGR
variabel tergantung pada bagaimana default telah ditetapkan pada waktu kompilasi), makagrotty
(selama itu tidak lulus-c
opsi) akan menggunakan urutan pelarian terminal ANSI SGR sebagai gantinya dari trik BS untuk atribut karakter.less
memahaminya saat dipanggil dengan-R
opsi.Orang FreeBSD memanggil
grotty
dengan-c
opsi kecuali Anda meminta warna dengan mengatur variabel MANCOLOR (dalam hal-c
ini tidak diteruskan kegrotty
dangrotty
kembali ke default menggunakan ANSI SGR urutan melarikan diri di sana).akan bekerja di sana.
Di Debian, GROFF_SGR bukan default. Jika kamu melakukan:
Namun, karena
man
stdout bukan terminal, dibutuhkan sendiri untuk meneruskanGROFF_NO_SGR
variabel kegrotty
(saya kira sehingga dapat digunakancol -bpx
untuk menghapus urutan BS karenacol
tidak tahu cara menghapus urutan SGR, meskipun masih melakukannya denganMAN_KEEP_FORMATTING
) yang menimpaGROFF_SGR
. Anda bisa melakukannya:(di terminal) untuk mendapatkan urutan pelarian SGR.
Saat itu, Anda akan melihat bahwa beberapa dari NAMA itu tampil dengan huruf tebal di terminal (dan dalam
less -R
pager). Jika Anda memberi makan output kesed -n l
(MANPAGER='sed -n /NAME/l'
), Anda akan melihat sesuatu seperti:Di mana
\e[1m
urutan untuk mengaktifkan huruf tebal di terminal yang kompatibel dengan ANSI, dan\e[0m
urutan untuk mengembalikan semua atribut SGR ke default.Pada teks itu
grep NAME
berfungsi sebagai teks yang memang berisiNAME
, tetapi Anda masih bisa memiliki masalah jika mencari teks di mana hanya bagian itu yang dicetak tebal / bergaris bawah ...sumber
sed -n l
sebagai penggantiod
.Jika Anda melihat halaman manual apa pun, Anda akan melihat bahwa judulnya dicetak tebal. Ini dicapai melalui pemformatan dengan karakter kontrol. Untuk dapat
grep
menyukai yang Anda inginkan, ini harus dihilangkan.The
col
utilitas dapat digunakan untuk ini:The
-b
pilihan memiliki deskripsi berikut pada OpenBSD :Linux
col
manual (di Ubuntu) tidak memiliki kalimat terakhir di sana (tetapi bekerja dengan cara yang sama).Di Linux, membatalkan pengaturan
MAN_KEEP_FORMATTING
variabel lingkungan (atau menyetelnya ke string kosong) juga dapat membantu, dan akan memungkinkan Anda untukgrep
tanpa melewati keluaranman
throughcol -b
.sumber
NAME
di bash adalah adilNAME
, tidak\b
.MAN_KEEP_FORMATTING
variabel bekerja persis seperti yang Anda katakan. Saya hanya ingin menunjukkan bahwa tidak selalu demikian.