Seperti yang diilustrasikan gambar, saya gunakan l
untuk mendapatkan file di folder saat ini. Dan kemudian saya ingin mendapatkan file dengan nomor 1
, jadi saya menggunakan pipe
dan grep
.
Tetapi mengapa 2
dan 22
file muncul? Dan apa itu 1;34m
?
$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22
Memperbarui
Saya sudah alias perintah l
dalam zshrc
file saya .
alias lsp="ls"
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ls="ls -alh --color"
Dan ini adalah hasil dari type
perintah:
>$ type ls
ls is an alias for ls -alh --color
> $ type l
l is an alias for ls -CF
command-line
grep
ls
pipe
Lee
sumber
sumber
type -a l
?type ls
perintah? sudahkah Anda memodifikasils
alias dengan cara apa pun?Jawaban:
Pertama-tama, apa yang Anda coba lakukan,
l| grep <filename>
itu buruk. Jangan lakukan itu. Inilah sebabnya.l
Perintah ini sebenarnya adalah alias untukls -CF
Secara default di Ubuntu
bash
,ls
adalah alias untukls --color=auto
. Seperti yang ditunjukkan steeldriver dalam komentar--color=auto
yang seharusnya mematikan pewarnaan. Dalam kasus spesifik Anda, Anda memilikialias ls="ls -alh --color"
danalias l="ls -CF"
, yang pada dasarnya berakhirls -alh --color -CF
. Kombinasi sakelar khusus ini masih mengirimkan keluaran berwarna melalui pipa. Sebagai contoh:Perhatikan bagaimana direktori
.
dan..
memiliki urutan pelarian yang sama.Apa arti semua ini?
Ini berarti bahwa
l
akan menampilkan daftar file berwarna sesuai dengan jenis file. Masalahnya adalah bahwa pewarnaan terjadi dengan penggunaan urutan melarikan diri . Itulah yang terjadi1:34m
- mereka melarikan diri urutan untuk warna tertentu.Masalah utama adalah bahwa parsing
ls
sering menyebabkan output yang salah dan bencana dalam skrip, hanya karenals
memungkinkan urutan melarikan diri seperti yang dijelaskan sebelumnya dan karakter khusus lainnya. Lihat artikel ini untuk info lebih lanjut: http://mywiki.wooledge.org/ParsingLsApa yang seharusnya Anda lakukan:
Gunakan
find
perintah:Anda dapat melakukan sesuatu seperti ini dengan shell glob dan
[[
perintah tes modern :Atau mungkin menggunakan python, yang memiliki kemampuan menangani nama file yang jauh lebih baik daripada
bash
sendirianJika tidak perlu memproses output
ls
, globbing sederhanals
dapat melakukan pekerjaan juga. (Ingat, ini hanya untuk melihat daftar file, bukan untuk meneruskannya ke program lain untuk berurusan dengan teks output)sumber
--color=always
juga ditentukan - baik sebagai bagian dari alias untukl
atau dalam alias sebelumnya untukls
dirinya sendiri (mengganti defaultalias ls='ls --color=auto'
).ls
di-bash secara default?type ls
memberi saya bahwa itu adalah alias untukls --color=auto
auto
mematikan warna dalam AFAIK pipa. Agar dapat melihat urutan warna ANSI, itu harus diubah menjadi--color=always
, baik dalamls
alias ataul
aliasls --color
, tidak mencegah pewarnaan (diuji sendiri juga). Diperbarui jawaban saya sesuaiPerintah Anda
l
danls
diatur sebagai alias.Ketika Anda menjalankannya, perpipkan output melalui
grep "1"
(menggunakan|
) setiap baris layar di mana1
muncul ditampilkan, dengan1
berwarna merah.Karena nama file
.
,..
,2
dan22
muncul pada baris layar yang sama, mereka output dengangrep
juga tapi tidak muncul dalam warna merah yang menunjukkangrep
pertandingan.Ini
:34m
adalah urutan pelarian untuk warna yang tidak melukis dengan benar. Berdasarkan pertanyaan Anda yang telah direvisi dengan hasiltype -a l
dantype -a
dapat direproduksi di sistem saya. Harap perhatikan bahwa Anda harus mengubah alias dari--color
menjadi--color=auto
:Output warna
sumber
1:34m
hal tidak korupsi, mereka melarikan diri urutan yang digunakan untuk pewarnaan teks. Lihat jawaban saya di bagian itu;)Dalam percobaan Anda, Anda memanggil
ls
alias Anda , dengan demikian1;34m
suara berisik dan serupa yang berasal dari pewarnaan, dan karena pipa|
menerima semua ini pada baris yang sama, makagrep
cocok dengan file1
dari garis itu dan akibatnya mencetak baris ini. Inilah yang Anda lihat di layar.Ketika Anda melakukan hal-hal seperti itu, selalu baik untuk kembali ke perintah sistem dengan 1 hasil per baris.
Untuk menghilangkan alias ketikkan saja
\ls
, dan gunakan opsi-1
untuk mencetak hasil yang dipisahkan oleh umpan baris.Catatan: metode backslash bekerja dengan setiap perintah,
\command
cukup panggil perintah sistem yang tidak diubah.sumber