Fish - เชลล์แบบโต้ตอบที่เป็นมิตร
(github.com/fish-shell)- fish เป็นเชลล์บรรทัดคำสั่งที่ใช้งานง่าย ทำงานบน macOS, Linux และระบบตระกูลที่เกี่ยวข้อง โดยมีการไฮไลต์ไวยากรณ์ คำแนะนำอัตโนมัติระหว่างพิมพ์ และการเติมคำด้วยแท็บให้ใช้ได้ทันทีโดยไม่ต้องตั้งค่าเพิ่มเติม
- โดยทั่วไปทำงานคล้ายกับเชลล์อื่นอย่าง bash หรือ zsh แต่ความแตกต่างสำคัญที่ค้นหาได้ด้วยคำว่า “unlike other shells” ได้ถูกรวบรวมไว้ในบทแนะนำอย่างเป็นทางการ
- เส้นทางการติดตั้งแยกตามแพลตฟอร์ม โดยบน macOS รองรับ Homebrew, MacPorts, ตัวติดตั้งจาก fishshell.com และแอปแบบสแตนด์อโลน
- เวอร์ชัน macOS ขั้นต่ำที่รองรับคือ 10.12
- แพ็กเกจสำหรับ Debian, Fedora, openSUSE, Red Hat Enterprise Linux/CentOS บน Linux มีให้ผ่าน openSUSE Build Service
- แพ็กเกจ Ubuntu สามารถติดตั้งได้ผ่าน fish PPA
- บน Windows 10/11 สามารถติดตั้งได้ตามขั้นตอนของดิสโทร Linux บน WSL หรือบิลด์จากซอร์ส และบน Windows ทุกเวอร์ชันรองรับการติดตั้งผ่าน Cygwin หรือ MSYS2
- หลังติดตั้ง ให้เริ่มใช้งานโดยรัน
fishในเชลล์ปัจจุบัน และสามารถดูเอกสารผู้ใช้ได้จากคำสั่งhelpภายใน fish รวมถึงเอกสารอย่างเป็นทางการ - การรันต้องใช้ยูทิลิตี POSIX พื้นฐานและยูทิลิตีระบบ *nix ทั่วไป เช่น
mktempส่วนฟีเจอร์เสริมบางอย่างต้องใช้เครื่องมือเพิ่มเติม- การสร้างการเติมคำอัตโนมัติจากหน้า manual และเครื่องมือตั้งค่าผ่านเว็บ
fish_configต้องใช้ Python 3.5+ - การเชื่อมรวมกับคลิปบอร์ดของระบบต้องใช้หนึ่งใน
xsel,xclip,wl-copy/wl-paste,pbcopy/pbpaste - การเติมคำแบบครบถ้วนสำหรับ
yarnและnpmต้องใช้โมดูล NPMall-the-package-names
- การสร้างการเติมคำอัตโนมัติจากหน้า manual และเครื่องมือตั้งค่าผ่านเว็บ
- การบิลด์จากซอร์สต้องใช้ Rust 1.85 ขึ้นไป, CMake 3.15 ขึ้นไป และคอมไพเลอร์ C โดย PCRE2 และ gettext ถือเป็น dependency แบบเลือกใช้
- รองรับทั้งการบิลด์ด้วย CMake และ Cargo โดยการบิลด์ด้วย Cargo จะวางไบนารีแบบสแตนด์อโลนไว้ที่
~/.cargo/bin/ส่วนการติดตั้งแบบเต็มด้วย CMake จะมี man page ในตำแหน่งมาตรฐาน สำเนาเอกสาร HTML ในเครื่อง และตัวเลือกไดเรกทอรีสำหรับฟังก์ชัน การเติมคำ และการตั้งค่าเพิ่มเติม
2 ความคิดเห็น
ตอนนี้ผมใช้ zsh อยู่ แต่ถ้ามีโอกาสครั้งหน้าก็อยากลองใช้ fish ดูสักครั้งเหมือนกัน
ความคิดเห็นจาก Hacker News
ข้อดีที่ใหญ่ที่สุดของ fish คือ แทบไม่ต้องตั้งค่าอะไรเลย ผมอายุ 41 แล้ว มีครอบครัวด้วย จึงไม่มีความอดทนจะเสียเวลากับการตั้งค่าเครื่องมือเลย และทุกครั้งที่พยายามทำให้ zsh ใช้งานได้ถูกใจ ก็รู้สึกเหมือนมันคอยขวางอยู่เสมอ
สคริปต์ zsh หลายตัวก็พูดได้ยากว่าแข็งแรงทนทาน และถ้าใช้เชลล์บ่อย ๆ สุดท้ายก็จะเจอ edge case ที่ชุดสคริปต์ผู้ใช้ซึ่งส่วนใหญ่ที่มามักเป็นการคัดลอกแปะ จัดการไม่ครอบคลุม
fish dotfiles ของผมอยู่ที่ https://github.com/mattgreen/dotfiles/tree/master/fish มีแค่ระบบปลั๊กอินแบบใช้ submodule, git prompt แบบอะซิงโครนัส, alias และ environment variable ไม่กี่ตัว
fish ให้มาแทบครบอยู่แล้ว จึงไม่ต้องบำรุงรักษาอะไร และตอนนี้สิ่งเดียวที่อยากได้คือให้ prompt แบบอะซิงโครนัส กลายเป็นฟีเจอร์ระดับ first-class เพราะเรื่องการติดตามสถานะเป็นสิ่งที่เชลล์ควรรับผิดชอบมากกว่าโค้ดของผู้ใช้
ที่น่าหงุดหงิดกว่าคือเวลาพวกเขาขอความช่วยเหลือ คำสั่งที่ผมบอกไปใช้ใน fish ไม่ได้สักคำสั่ง ทำให้ การแก้ปัญหาช้ามาก
การตั้งค่า zsh ที่เหลือส่วนใหญ่เป็น prompt utility กับสิ่งที่เพิ่มเข้ามาตลอดหลายปี และผมไม่ได้ใช้หรือจำเป็นต้องใช้ปลั๊กอินเลย ถ้าจำเป็น zplug ที่เคยลองใช้มาก่อนก็ตั้งค่าและใช้ง่ายจริง ๆ
[1]: https://github.com/mid-kid/config/blob/master/shell/.zshrc#L...
/bin/shผมก็คงย้ายไป Fish ด้วยเหตุผลคล้าย ๆ กันในมุมมองของ ประสบการณ์ผู้ใช้ มันนำหน้าเชลล์อื่นแบบทิ้งห่าง และน่าแปลกใจที่ระบบปฏิบัติการอย่าง Mac ยังไม่เลือกเป็นค่าเริ่มต้น ถ้าใช้ Fish ผมสามารถแนะนำคนในครอบครัวให้ทำงานในเทอร์มินัลได้โดยไม่มีใครหงุดหงิดหรือถอดใจ แต่กับเชลล์อื่นพูดแบบนั้นได้ยาก
เมื่อหลายปีก่อน ผมใช้เวลาประมาณหนึ่งชั่วโมงเลือกปลั๊กอินที่ต้องการและสร้าง repo ตอนนี้เครื่องใหม่ใช้เวลา 5–10 นาทีก็พร้อมแล้ว
ผมใช้ Fish เป็น login shell มานานกว่า 10 ปีแล้ว และต่างจากหลายคน ผมใช้มันกับ การเขียนสคริปต์ ด้วย สำหรับงานง่าย ๆ มันมีหลุมน้อยกว่า bash จึงเขียนสคริปต์ได้ดีกว่ามาก
เวลาอ่านคำอธิบายออนไลน์ การแปลงตัวอย่าง bash ไปเป็น fish เป็นเรื่องเล็กน้อย ผมไม่เข้าใจว่าทำไมถึงบอกว่านั่นเป็นปัญหา และจริง ๆ แล้วไม่เคยลำบากเพราะเรื่องนี้เลย
set -eของ bash ผมเข้าใจว่าทำให้มันทำงานได้ดีในทุกกรณี เช่น รวมถึง pipefail ด้วยนั้นยาก แต่ถ้าไม่มีฟีเจอร์นี้ ผมก็ไม่อยากเขียนสคริปต์จำนวนมากผมใช้ fish มาประมาณ 5 ปีแล้ว และตอนนี้ไม่อยากกลับไปอีก ต่อให้ไม่ติดตั้งฟีเจอร์เสริมใด ๆ เลย สถานะเริ่มต้นของมันก็ทำทุกอย่างที่การตั้งค่า zsh เดิมของผมซึ่งเคยผูกทั้ง package manager และปลั๊กอินไว้ทำได้ครบ
สิ่งที่เปลี่ยนมีแค่เพิ่ม spacefish และตอนนี้เพิ่ม starship.rs เท่านั้น
zก็น่าลองใช้เช่นกัน และตอนนี้ผมดูการตั้งค่าไม่ได้ แต่มีปลั๊กอินที่แจ้งเตือนเมื่อคำสั่งเบื้องหลังที่รันนาน ๆ เสร็จ ซึ่งค่อนข้างมีประโยชน์ไม่ได้ติดตามมานาน เลยลองรวบรวมเธรดที่เกี่ยวข้องไว้ มีอีกไหม?
What's Happening with Fish Releases? - https://news.ycombinator.com/item?id=36875727 - กรกฎาคม 2023
My shell setup with Fish and Tmux (2021) - https://news.ycombinator.com/item?id=35672358 - เมษายน 2023
Ask HN: Are alternative (oil, nu, etc.) shells usable as daily drivers? - https://news.ycombinator.com/item?id=34722208 - กุมภาพันธ์ 2023
Rewrite it in Rust - https://news.ycombinator.com/item?id=34588340 - มกราคม 2023
Fish 3.6.0 - https://news.ycombinator.com/item?id=34298157 - มกราคม 2023
Fish Shell 3.5.0 - https://news.ycombinator.com/item?id=31768405 - มิถุนายน 2022
Fish 3.4.0 - https://news.ycombinator.com/item?id=30734072 - มีนาคม 2022
Fish 3.4.0 Released - https://news.ycombinator.com/item?id=30660587 - มีนาคม 2022
Ask HN: Oil or Fish Shell? - https://news.ycombinator.com/item?id=30154652 - มกราคม 2022
The fish shell is amazing - https://news.ycombinator.com/item?id=29341390 - พฤศจิกายน 2021
Nsh: A fish/bash-like Posix shell in Rust - https://news.ycombinator.com/item?id=28967257 - ตุลาคม 2021
Fish Shell 3.3 - https://news.ycombinator.com/item?id=27663637 - มิถุนายน 2021
Fish shell - https://news.ycombinator.com/item?id=27180420 - พฤษภาคม 2021
Fish Shell 3.2 - https://news.ycombinator.com/item?id=26302678 - มีนาคม 2021
Fish is not operational on a VT220 terminal (2015) - https://news.ycombinator.com/item?id=25526237 - ธันวาคม 2020
New Features in the Fish Shell - https://news.ycombinator.com/item?id=24631138 - กันยายน 2020
Dolphins learn from their peers to use empty shells to catch fish - https://news.ycombinator.com/item?id=23660910 - มิถุนายน 2020
Fish Shell 3.1.0 - https://news.ycombinator.com/item?id=22314671 - กุมภาพันธ์ 2020
Fish: A command line shell for the 90s - https://news.ycombinator.com/item?id=21361696 - ตุลาคม 2019
Show HN: Fisher 3.0 – the package manager for the fish-shell - https://news.ycombinator.com/item?id=18920972 - มกราคม 2019
Fish shell 3.0 - https://news.ycombinator.com/item?id=18776765 - ธันวาคม 2018
Fish: A user-friendly command line shell for macOS, Linux, etc - https://news.ycombinator.com/item?id=15910897 - ธันวาคม 2017
Fish (Shell) for a Week - https://news.ycombinator.com/item?id=14422672 - พฤษภาคม 2017
Why I'm Hooked on Fish Shell (and How to Set It Up Right) - https://news.ycombinator.com/item?id=14417046 - พฤษภาคม 2017
The fish shell is awesome - https://news.ycombinator.com/item?id=14179081 - เมษายน 2017
Fish Shell Design Principles - https://news.ycombinator.com/item?id=11102941 - กุมภาพันธ์ 2016
Fish shell 2.2 - https://news.ycombinator.com/item?id=9873090 - กรกฎาคม 2015
Fish shell - https://news.ycombinator.com/item?id=9566441 - พฤษภาคม 2015
FISH Shell: A dynamic shell - https://news.ycombinator.com/item?id=8783150 - ธันวาคม 2014
Fish shell 2.1 - https://news.ycombinator.com/item?id=6626635 - ตุลาคม 2013
fish shell - https://news.ycombinator.com/item?id=6224524 - สิงหาคม 2013
Fish shell 2.0 - https://news.ycombinator.com/item?id=5723235 - พฤษภาคม 2013
Fish 2.0 shell beta - https://news.ycombinator.com/item?id=5567639 - เมษายน 2013
Fish: Finally, a command line shell for the 90s - https://news.ycombinator.com/item?id=4073162 - มิถุนายน 2012
Fish sucks (but your shell sucks more) - https://news.ycombinator.com/item?id=2031110 - ธันวาคม 2010
Fish - The friendly interactive shell - https://news.ycombinator.com/item?id=820677 - กันยายน 2009
Fish Shell: A User-Friendly Shell or Like a Heavily Customized zsh - https://news.ycombinator.com/item?id=811113 - กันยายน 2009
https://news.ycombinator.com/item?id=23660910 อาจเป็น ลิงก์กับดัก เพื่อดูว่าใครกำลังจับตาดูอยู่ก็ได้ :)
เคยลองใช้ zsh อยู่ช่วงหนึ่ง แต่ในสถานะพื้นฐานจริง ๆ ก็คล้าย bash และรู้สึกว่าถ้าจะเห็นข้อดีต้องใช้เวลาปรับแต่งเอง ไม่อยากเสียเวลากับการตั้งค่าเชลล์ แค่อยากให้มันใช้งานได้ทันที
Fish ดีกว่า bash อย่างเห็นได้ชัดแม้ไม่ตั้งค่าอะไรเลย และ การเติมคำอัตโนมัติที่เหมือนเวทมนตร์ ก็ถึงขั้นเปลี่ยนชีวิตได้
ตอนมหาวิทยาลัยใช้ fish บน Ubuntu และ MacBook ที่ได้จากงานแรกก็ตั้งค่าเป็น fish ด้วย ตอนนั้นมีคนดูแล DevOps แค่คนเดียว แต่เอกสารตั้งค่าแอปกับสคริปต์มีไว้สำหรับ zsh หรือ bash เท่านั้น และพูดตรง ๆ ก็คิดว่าเปลี่ยนไปใช้ zsh ก็ได้
แต่เขาห้ามไว้ แล้วใช้เวลาครึ่งวันเรียน fish ก่อนจะเพิ่ม สคริปต์ fish ทั้งหมดลงในเอกสารให้ด้วย เป็นคนที่น่าขอบคุณจริง ๆ
สิ่งที่ดีของ fish คือแม้ไม่ติดตั้งปลั๊กอินก็มี ฟีเจอร์อำนวยความสะดวก มาให้ค่อนข้างมากตั้งแต่แรกอยู่แล้ว ที่เพิ่มเองมีแค่การเชื่อมกับ starship.rs และ fzf
ชอบแท็กไลน์ของ fish มาก และค่อนข้างตลกด้วย เคยใช้มาพักหนึ่งและก็ดีพอสมควร แต่ในเชิงกลยุทธ์การพัฒนา เขาจงใจหลีกเลี่ยงตัวเลือกที่ตั้งค่าได้อย่างชัดเจน
มีบางอย่างที่รบกวนใจอยู่เรื่อย ๆ แต่ไม่มีวิธีเปลี่ยนพฤติกรรมได้ เลยย้ายไป zsh แล้วทำให้ทำงานเหมือน fish แต่เป็นแบบที่ตัวเองต้องการ สำหรับผมเป็นการตัดสินใจที่ดีและแนะนำได้ ไม่ค่อยชอบ oh-my-zsh หรือ plugin manager ด้วย
ผมใช้ fish, zsh และตอนนี้ใช้ elvish ด้วย สิ่งสำคัญสำหรับผมคือ autosuggestion และฟีเจอร์ดึง history ด้วยปุ่มลูกศรขึ้น zsh มีโมดูล autosuggestion ส่วน elvish มี history จากลูกศรขึ้น แต่จะจับคู่เฉพาะส่วนต้นเท่านั้น
ดังนั้น fish ยังนำอยู่ และ elvish เป็นอันดับสอง เพราะการพิมพ์คำสั่งแล้วกดลูกศรขึ้นหนึ่งครั้งให้ความรู้สึกแทบเหมือน autosuggestion ผมหาวิธีทำแบบนั้นใน zsh ไม่เจอ และในเรื่องการจัดการ block ก็ชอบวิธีของ fish กับ elvish มากกว่าสไตล์ตระกูล sh แบบดั้งเดิม
ข้อผิดพลาดใหญ่ที่สุดของ fish คือ ไม่เข้ากันได้กับ bash คุ้นกับ bash มากเกินไป และระบบของบริษัทบางส่วนเข้าถึงได้แค่ bash และติดตั้ง fish ไม่ได้ เลยไม่อยากเปลี่ยน
การต้องสลับไปมาระหว่างภาษาสคริปต์ต่างกันเรื่อย ๆ เป็นเรื่องทรมาน และคงทำด้วย muscle memory ได้ไม่สบาย
#!/bin/bashไว้บนสุดของสคริปต์ แล้วเขียนสคริปต์ด้วย bash ต่อไป ส่วนเชลล์แบบโต้ตอบก็ใช้ fish อย่างเดียวไม่ได้เหรอ?ส่วนตัวแทบไม่ใส่อะไรซับซ้อนขนาดนั้นลงในเชลล์ และถ้าไปถึงจุดนั้นก็จะแยกออกมาเป็นสคริปต์
bassแล้วก็แทบไม่รู้สึกว่าต้องสลับเลยhttps://github.com/edc/bass
แม้จะไม่ได้ใช้ fish แต่มีฟีเจอร์ยอดเยี่ยมอย่างหนึ่งที่ zsh ยังโคลนตามไม่ได้ คือมันสร้างการเติมคำอัตโนมัติจาก หน้า man ทำให้ได้การเติม flag พื้นฐานโดยอัตโนมัติสำหรับแทบทุกโปรแกรม