เหตุใด Mac Terminal จึงจดจำคำสั่งที่ต่อเนื่องกันสองคำสั่งเมื่อเหมือนกัน?


10

ฉันเริ่มใช้ Mac เมื่อไม่นานมานี้และก่อนหน้านี้ฉันเคยทำงานกับ Ubuntu

สมมติว่าฉันรันคำสั่งเหล่านี้ทีละรายการบนเทอร์มินัลของฉัน:

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

ตอนนี้สมมติว่าฉันต้องการเรียกใช้python main.pyอีกครั้งดังนั้นฉันจะคลิกปุ่มขึ้น ฉันจะต้องคลิกคีย์สองครั้งเท่านั้นบน Ubuntu แต่ 7 ครั้งบน Mac

หากสองคำสั่งติดต่อกันเหมือนกันเทอร์มินัลควรจดจำเพียงหนึ่งคำสั่งแทนที่จะจดจำสองคำสั่งที่ต่างกัน

ฉันจะทำให้สิ่งนี้เกิดขึ้นได้ใน macOS ได้อย่างไร


6
เพียงเพื่ออวดความจริงแล้วมันไม่ใช่ขั้ว Mac ที่ทำสิ่งนี้ มันทุบตีเชลล์ของคุณกำลังวิ่งอยู่ในเครื่อง มีเชลล์จำนวนมากและเป็นไปได้และเป็นเรื่องธรรมดาที่จะแทนที่เชลล์เริ่มต้นด้วยอย่างอื่นzshและเพื่อปรับแต่ง zshด้วยสคริปต์ต่างๆ
gman

คำตอบ:


13

คุณต้องเพิ่มตัวแปรสภาพแวดล้อม HISTCONTROL .bash_profileเพื่อคุณ ใน.bash_profileเพิ่มบรรทัดต่อไปนี้:

export HISTCONTROL=ignoreboth:erasedups

ปิดและเริ่มเซสชัน bash ของคุณใหม่ หรือคุณเพียงแค่เรียกใช้บรรทัดเดียวกันนั้นและจะมีผลสำหรับเซสชันนั้น (ใช้เพื่อทดสอบ)


จากหน้าคู่มือสำหรับbash (ในเทอร์มินัล):

HISTCONTROL
รายการค่าคั่นด้วยโคลอนที่ควบคุมวิธีบันทึกคำสั่งในรายการประวัติ หากรายการค่ามีการไม่ตอบสนองบรรทัดที่ขึ้นต้นด้วยอักขระเว้นวรรคจะไม่ถูกบันทึกในรายการประวัติ ค่าของการเพิกเฉยทำให้เกิดบรรทัดที่ตรงกับรายการประวัติก่อนหน้าไม่ถูกบันทึก ค่าของignorebothคือชวเลขignorespaceและignoredups ค่าของการลบทำให้บรรทัดก่อนหน้าทั้งหมดที่ตรงกับบรรทัดปัจจุบันถูกลบออกจากรายการประวัติก่อนที่จะบันทึกบรรทัดนั้น ค่าใด ๆ ที่ไม่อยู่ในรายการด้านบนจะถูกละเว้น ถ้าHISTCONTROLไม่มีการตั้งค่าหรือไม่รวมถึงค่าที่ถูกต้องทุกสายอ่านโดย parser เปลือกจะถูกบันทึกไว้ในรายการประวัติภายใต้ค่าของHISTIGNORE สายที่สองและที่ตามมาของคำสั่งผสมหลายสายยังไม่ได้ผ่านการทดสอบและจะมีการเพิ่มประวัติโดยไม่คำนึงถึงความคุ้มค่าของHISTCONTROL


4

ทำไมสิ่งนี้ถึงเกิดขึ้น

MacOS และ Ubuntu ได้รับการกำหนดค่าแตกต่างกันออกไปเพื่อจัดการรายการที่ซ้ำกันในประวัติคำสั่งของ bash การกำหนดค่าเหล่านี้จะถูกเก็บไว้ในจำนวนที่เรียกว่า " จุดไฟล์ " สิ่งเหล่านี้อยู่ในรูปของ ~ / .bash * รวมถึงระบบ / etc / profile ไฟล์ทั้งหมดเหล่านี้อาจถูกปรับแต่งตามความชอบและความแตกต่างระหว่างเชลล์แบบโต้ตอบ, เชลล์ล็อกอิน, เชลล์ระยะไกลฯลฯ ไฟล์เหล่านี้จะถูกอ่านตามลำดับที่เฉพาะเจาะจงและให้บริการฟังก์ชั่นเฉพาะ

วิธีการรับพฤติกรรมเดียวกันบน macOS

หากคุณต้องการเพียงแค่นี้การปรับแต่งเพียงครั้งเดียวของ "ละเว้นคำสั่งที่ซ้ำกันของบรรทัดคำสั่ง" คุณอาจไปกับคำตอบของ Allan เช่นเพิ่มหนึ่งบรรทัดเดียวเช่นไฟล์ bash_profile ของคุณ ไม่มี "วิธีที่เหมาะสม" แต่มีตัวเลือกมากมาย

ในกรณีที่นี่ไม่ใช่การปรับแต่งเฉพาะสำหรับ bash ของคุณนี่อาจไม่ใช่ตัวเลือกที่ดีที่สุด:

หมายเหตุอื่น ๆ :

  • สิ่งใดก็ตามที่ควรมีให้สำหรับแอปพลิเคชันกราฟิกหรือ sh (หรือ bash ที่เรียกใช้เป็น sh) ต้องอยู่ใน ~ / .profile
  • ~ / .bashrc ต้องไม่แสดงผลใด ๆ
  • สิ่งใดก็ตามที่ควรมีให้สำหรับการเข้าสู่ระบบเปลือกเท่านั้นควรเข้าสู่ ~ / .profile
  • ตรวจสอบให้แน่ใจว่า ~ / .bash_login ไม่มีอยู่

ซึ่งหมายความว่าเมื่อสิ่งต่าง ๆ มีความซับซ้อนมากขึ้นเป็นความคิดที่ดีที่จะกระจายการปรับแต่งออกเป็นหลาย ๆ ไฟล์แต่ละไฟล์นั้นมีความเชี่ยวชาญและมีการเรียงลำดับอย่างมากในเนื้อหา:

ทั้งหมดexportsอาจอยู่ในไฟล์ของตนเองเพื่อการกำกับดูแลที่ง่ายขึ้น

สร้างไฟล์ที่อ่านโดย bash ที่รูทของไดเรกทอรีผู้ใช้ของคุณตัวอย่างเช่นชื่อ.exportsที่มี:

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

สิ่งนี้จะต้องเป็น "แหล่งที่มา" เพื่อให้ไฟล์ถูกอ่านโดยการทุบตีในการเริ่มต้นแบบโต้ตอบ:

การจัดหาไฟล์
หากคุณมีการกำหนดค่าเชลล์จำนวนมากคุณอาจต้องการแบ่งออกเป็นไฟล์ย่อยหลายไฟล์และใช้ซอร์สในตัวเพื่อโหลดไฟล์จาก. bashrc ของคุณด้วยการเพิ่มsource ~/.exportsเข้าไป

อีกทางหนึ่งเพื่อให้แน่ใจว่าไฟล์มีอยู่จริงก่อนที่จะโหลด

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

คำสั่ง. ~/.exportsจะมา~/.exportsในบริบทของเชลล์ที่รันอยู่ในปัจจุบัน

สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการเพิ่มชื่อแทนไฟล์แยกต่างหากช่วยให้สามารถโหลดซ้ำได้ง่ายขึ้นเมื่อคุณทำการเปลี่ยนแปลง


2
.exportsอ่านได้อย่างไร(มีที่มา)?
fd0

1
@ fd0 โดยตัวมันเองมันไม่ได้มาจาก macOS คำตอบของอัลลันเป็นวิธีที่เหมาะสมในการบรรลุเป้าหมายนี้
user3439894

หากHISTCONTROLมีการตั้งค่าของ.bashrcและ~/.bashrcมีที่มา~/.bash_profileจากนั้นก็ไม่จำเป็นต้องexportมีHISTCONTROLตัวแปร ทั้งเชลล์ล็อกอินแบบโต้ตอบและเชลล์แบบโต้ตอบจะมีชุดตัวแปร
fd0

@ fd0 ว่า: ถ้า / ในกรณีที่ฉันไม่เข้าใจ: จุดของฉันคือการให้ alt ไปยังอัลลันที่โพสต์พร้อมกันของ A & & เก็บ esp _profile แต่ก็มีความสะอาดและเป็นระเบียบเรียบร้อยที่สุดเท่าที่จะทำได้เพราะนี่เป็นสถานการณ์ที่มีการพิจารณาตัวเลือก / การตั้งค่าจำนวนมาก ประเด็นสุดท้ายของคุณคือข้อเสนอแนะในการเพิ่มหรือตั้งใจแก้ไขซึ่งคุณอาจเข้าใจวิธีข้างต้นว่า 'ผิด' หรือไม่? ตอนนี้ฉันอ่านความคิดเห็นของคุณระหว่างฉันกับอัลลันในระดับความซับซ้อนที่ได้รับคำตอบใช่ไหม
LаngLаngС

1

ในการบันทึกคำสั่งใหม่ทุกคำสั่งนั้นไม่ยุ่งยาก ก่อนอื่นคุณต้องเพิ่ม ~/.profileหรือคล้ายกัน:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

จากนั้นคุณต้องเพิ่ม~/.bash_logout:

history -a
history -w
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.