Mengapa Terminal Mac mengingat dua perintah berurutan padahal sama?


10

Saya mulai menggunakan Mac baru-baru ini dan sebelum saya dulu bekerja di Ubuntu.

Misalkan saya menjalankan perintah ini satu per satu di terminal saya:

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

Sekarang anggaplah saya ingin menjalankan python main.pylagi, jadi saya akan mengklik tombol atas. Saya perlu mengklik tombol hanya dua kali di Ubuntu tetapi 7 kali pada Mac.

Jika dua perintah berurutan sama, maka terminal harus hanya mengingat satu perintah alih-alih mengingat dua perintah yang berbeda.

Bagaimana saya bisa mewujudkannya di macOS?


6
Hanya untuk bertele-tele, sebenarnya bukan terminal mac yang melakukan ini. Ini bash, shell Anda berjalan di terminal. Ada banyak shell dan mungkin dan umum untuk mengganti shell default dengan sesuatu yang lain seperti zshdan bahkan lebih jauh untuk menyesuaikan zsh dengan berbagai skrip.
GM

Jawaban:


13

Anda perlu menambahkan variabel lingkungan HISTCONTROL ke .bash_profile. Di .bash_profiletambahkan Anda baris berikut:

export HISTCONTROL=ignoreboth:erasedups

Tutup dan mulai kembali sesi bash Anda dan dupes harus hilang. Atau, Anda bisa menjalankan baris yang sama dan itu akan berlaku untuk sesi itu (gunakan untuk mengujinya).


Dari halaman manual untukbash (di Terminal):

HISTCONTROL
Daftar nilai-nilai yang dipisahkan oleh titik dua yang mengendalikan bagaimana perintah disimpan pada daftar sejarah. Jika daftar nilai termasuk abaikan , garis yang dimulai dengan karakter spasi tidak disimpan dalam daftar riwayat. Nilai diabaikannya menyebabkan garis yang cocok dengan entri riwayat sebelumnya tidak disimpan. Nilai ignoreboth adalah singkatan untuk ignorespace dan ignoredups . Nilai penghapusan menyebabkan semua baris sebelumnya yang cocok dengan baris saat ini dihapus dari daftar riwayat sebelum baris itu disimpan. Nilai apa pun yang tidak ada dalam daftar di atas diabaikan. Jika HISTCONTROLtidak disetel, atau tidak menyertakan nilai yang valid, semua baris yang dibaca oleh parser shell disimpan pada daftar riwayat, tunduk pada nilai HISTIGNORE . Baris kedua dan selanjutnya dari perintah majemuk multi-baris tidak diuji, dan ditambahkan ke sejarah terlepas dari nilai HISTCONTROL .


4

Mengapa ini terjadi?

MacOS dan Ubuntu dikonfigurasi secara berbeda di luar kotak untuk menangani duplikat dalam riwayat perintah bash. Konfigurasi ini disimpan dalam sejumlah yang disebut " dot-file ". Ini berbentuk ~ / .bash * dan juga sistem / etc / profile. Semua file ini dapat disesuaikan dengan keinginan Anda dan membedakan antara shell interaktif, shell login, shell jauh dll. File-file ini dibaca dalam urutan tertentu dan melayani fungsi-fungsi tertentu.

Bagaimana cara mendapatkan perilaku yang sama di macOS?

Jika Anda menginginkan yang ini saja, satu kustomisasi "mengabaikan duplikat baris perintah yang tepat", Anda dapat memilih jawaban Allan, yaitu menambahkan satu baris saja misalnya file bash_profile Anda. Tidak ada "cara yang tepat" tetapi pilihan yang tak terhitung jumlahnya.

Jika ini bukan satu-satunya penyesuaian untuk bash Anda maka ini mungkin bukan pilihan terbaik:

Beberapa catatan lain:

  • Apa pun yang harus tersedia untuk aplikasi grafis ATAU untuk sh (atau bash dipanggil sebagai sh) HARUS di ~ / .profile
  • ~ / .bashrc tidak boleh mengeluarkan apapun
  • Apa pun yang seharusnya tersedia hanya untuk login shell harus masuk ~ / .profile
  • Pastikan bahwa ~ / .bash_login tidak ada.

Itu berarti, ketika segalanya menjadi lebih rumit, ide yang baik untuk menyebar kustomisasi ke beberapa file, masing-masing dari mereka khusus dan sangat teratur dalam isinya:

Semua exportsdapat berada di file mereka sendiri untuk pengawasan yang disederhanakan.

Buat file yang dibaca oleh bash di root direktori pengguna Anda, misalnya disebut .exportsyang berisi:

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

Ini perlu "bersumber" sehingga file dibaca oleh bash pada startup interaktif:

Sumber file
Jika Anda memiliki banyak konfigurasi shell, Anda mungkin ingin membaginya menjadi beberapa subfile dan menggunakan sumber yang dibangun untuk memuatnya dari .bashrc: dengan menambahkannya source ~/.exports.

Atau, untuk memastikan file benar-benar ada sebelum memuat

if [ -f ~/.exports ]; then
. ~/.exports
fi

Perintah . ~/.exportsakan sumber ~/.exportsdalam konteks shell yang sedang berjalan.

Ini sangat berguna untuk menambahkan alias, file yang terpisah membuatnya lebih mudah untuk memuatnya kembali saat Anda membuat perubahan.


2
Bagaimana .exportsmembaca (bersumber)?
fd0

1
@ fd0, Dengan sendirinya, itu tidak bersumber di macOS. Jawaban Allan adalah cara yang tepat untuk mencapai ini.
user3439894

Jika nilai HISTCONTROLdiatur dalam .bashrcdan ~/.bashrcbersumber di ~/.bash_profilemaka tidak ada kebutuhan untuk exportitu HISTCONTROLvariabel. Baik shell login interaktif maupun shell interaktif akan memiliki set variabel.
fd0

@ fd0 Persis: jika . / Jika saya tidak mengerti: Maksud saya adalah untuk memberikan alt ke Allan's yang secara bersamaan diposting A / & menjaga esp _profile tetapi juga sisanya sebersih dan rapih karena ini adalah skenario di mana banyak pilihan / pengaturan dipertimbangkan. Apakah poin terakhir Anda merupakan saran untuk ditambahkan atau dimaksudkan sebagai koreksi karena Anda mungkin menganggap metode di atas sebagai 'salah'? Sekarang, saya membaca komentar Anda antara saya dan tingkat kesulitan yang dihadapi Allan?
LаngLаngі

1

Untuk merekam secara unik setiap perintah baru itu rumit. Pertama, Anda perlu menambahkan ~/.profileatau serupa:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Maka Anda perlu menambahkan ~/.bash_logout:

history -a
history -w
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.