Showing posts with label c shell. Show all posts
Showing posts with label c shell. Show all posts

Wednesday, August 5, 2009

ไกลปืนเที่ยง: FreeBSD ---> command(3)

ต้องขออภัยเพื่อนผองน้องพี่ ชาว FreeBSD ที่ห่างหายไปนาน

เรื่องที่นำเสนอวันนี้ เป็นคำสั่งที่จำเป็น สำหรับการใช้งานทั่วไปcommands รวมทั้ง command options ที่สมควรกำหนดไว้ก่อนเลย เพราะ FreeBSD นั้นทำงานในลักษณะของ multi users, multi programming ผลที่นึกไม่ถึงอาจเกิดขึ้น ตัวอย่างพื้นๆ คือการลบแฟ้ม เมื่อกดแป้นพิมพ์ Enter แล้ว ก็เป็นอันเลิกคิดที่จะ กู้แฟ้มนั้นกลับคืนมา ทั้งนี้ เพราะไม่มีทางทราบได้เลยว่า process ไหน ที่มาจับจอง inode ที่ว่างลงไปจากการที่เรา ลบแฟ้ม ทิ้ง การกำหนด -i , interactive option, เพื่อให้ผู้ใช้ สามารถหยุดยั้งคิดได้ จึงสมควรอยู่

อ้อ ขอทึกทักเอาว่า พี่พี่ต่างก็ใช้ csh , C shell, น่ะครับ สำหรับพี่พี่ที่ใช้ shell อื่นก็คงไม่มีปัญหา เพราะคงเข้าใจเรื่อง shell ที่ใช้ได้ดีพอควรแล้ว จะไม่ขอเขียนเรื่องของ shell ในนี้หละ

interactive mode

เพื่อให้เข้าใจว่า interactive mode นั้นเป็นอย่างไร อันดับแรก ก็ขอยกคำสั่ง ลบแฟ้ม มาให้ทราบก่อน ซึ่งเขามีรูปแบบ หรือ ไวยากรณ์คำสั่งแรกเริ่ม ดังนี้ ดูเอา จำเอาเน้าะ

rm filename

ก็อย่างที่เรียนให้ทราบแต่แรกแล้วว่า พอกด Enter ปุ้บ filename ก็หายวั้บไปเลย ซึ่งเราไม่ต้องการเช่นนั้น อย่างน้อย เราขอมีเวลายั้งคิดสักนิดหนึ่งก่อน เพราะ อาจเป็นไปได้ที่ ชื่อแฟ้ม มันใกล้เคียงกัน หรือสะดกชื่อแฟ้มผิดไป เช่น อยากลบแฟ้ม imid แต่ดันไปลบ imod ซึ่งสำคัญกว่า ถ้าใช้ interactive mode ก็จะเห็นข้อความที่จอ
remove imod ?
ขึ้นมา ก็ทำให้ทราบว่า เรากำลังจะลบสิ่งสำคัญออกไปน่ะ ยังดีกว่า พอกด Enter แล้วก็ ลบออกไปเลย ในกรณีนี้ ให้ตอบ n ไป แล้วกลับไปลบ imid ออกแทน

ใน interactive mode รูปแบบคำสั่งจะเป็นอีกอย่าง แบบนี้น่ะ

rm  -i   filename

กลุ่มคำสั่ง ที่ มะไฟ แนะให้ใช้งานใน interactive mode ก็มี rm ลบแฟ้ม, cp สำเนาแฟ้ม, mv โยกย้ายแฟ้ม

rm  -i   filename
cp  -i  src   dst
mv  -i  src   dst

alias

จากแนวคิดในเรื่อง interactive mode ทำให้เราต้อง เพิ่มการกดแป้นพิมพ์ ไปอีก ๓ เคาะ ไปเสียทุกครั้ง นับว่า ไม่สะดวกเลย แต่ csh เขามี facility ที่อำนวยความสะดวกให้ เรียกว่า alias ซึ่งเราสั่งซะทีเดียว ครั้งต่อไปที่เราเรียก ไม่ว่าจะเป็น rm mv หรือ cp ก็เท่ากับเราเรียก
rm -i
mv -i
cp -i

รูปแบบก็ง่ายๆ

alias rm    rm -i
alias cp    cp -i
alias mv    mv -i

~/.cshrc

การใช้บริการ alias ก็นับว่าสะดวกขึ้นมาก แต่ว่า เสียอยู่ว่า เราต้องมานั่งสั่งไปซะทุกครั้ง ที่ login เข้ามาทำงานนี่ซี บางทีที่ลืม ก็ทำเอาแย่ไปน่ะ

วิธีแก้ ก็มี โดยเอาคำสั่ง ที่แน่ใจ ว่า ต้องใช้งาน ทุกครั้งที่ login เข้ามาทำงาน นั้น อย่างของเราครั้งนี้ ก็พวก alias ทั้งหลาย ไว้ในแฟ้ม ~/.cshrc

แล้วเราจะแน่ใจยังไงว่า มันเป็นยังงั้นจริงๆ ?

วิธีตรวจสอบก็ง่ายๆ

alias

เท่านั้นเอง

ทำตามนี้ไปก่อนน่ะ มันเป็น ทริค สำหรับ เพิ่มข้อความ ทีละบรรทัด ต่อท้ายเอกสาร โดยไม่ต้องเรียก editor

% echo  alias  cp     cp  -i  >>  ~/.cshrc
% echo  alias  rm     rm  -i  >>  ~/.cshrc
% echo  alias  mv     mv  -i  >>  ~/.cshrc

แล้วก็ยังไม่ต้อง logout น่ะ แต่ให้สั่ง

% source  ~/.cshrc

แล้วลองสั่ง alias ดูซี อ้ออ้ออ้อ คงไม่เห็นความแตกต่าง ถ้าพี่ท่านทำ alias cp cp -i กับคณะ ไว้ก่อนหน้านี้แล้ว ถ้าเป็นยังงั้น ก็ให้สั่ง unalias ทั้งสามคำสั่งนั้นไปซะ ก่อนที่จะสั่ง source ดั่งว่า

/usr/share/skel/dot.cshrc

ดูเหมือนว่า จะมีประโยชน์ แต่ก็กับเราคนเดียวแหละน่อ จะให้ดี ให้มันเป็นยังงี้ทุกครั้ง ที่ เพิ่มผู้ใช้งานใหม่ เข้ามาในระบบเลยดีกว่า โดยไปแก้ที่แฟ้ม /usr/share/skel/dot.cshrc นี้เลย เพราะหน้าที่ของแฟ้มนี้คือ แปลงร่างเป็นแฟ้ม ~/.cshrc ให้กับผู้ใช้ในระบบนั่นเอง ที่เหลือ คงไม่ต้องแนะอะไรมาก สำหรับ แอ้ด เมืองมิน ที่เฉลียวฉลาด

ตั้งใจ จะเขียนเรื่องคำสั่งสักหลายๆคำสั่ง แต่พอเริ่มลงมือเข้า มันก็ลากไปเอง และ ไม่อยากให้ สายตาพี่พี่ล้า เลยต้องขอ น่ะ ขอยอ

ยอมีตั่ง
Wed Aug 5 17:42:19 ICT 2009

Tuesday, April 14, 2009

ไกลปืนเที่ยง: FreeBSD --> Shell

เรื่องของ FreeBSD ตั้งแต่ง่ายๆไป จนถึงการใช้งาน FreeBSD เป็นฐานรองรับ hardware เพื่อทำหน้าที่เป็น servers และงานอื่นๆในที่สุด ใจความในตอนนี้ ถอดจาก FreeBSD Handbook บทที่ ๓ Shell โดยแต่งเรื่องราวเสริมขึ้นบ้าง
วันนี้, ๒๕ เม.ย ๒๕๕๒ , เพิ่มส่วนของ chsh ให้



Shell

งานประจำวันทั่วไปใน FreeBSD กระทำผ่าน คำสั่งทางแป้นพิมพ์ ที่เรียกว่า shell งานหลักของ shell คือรับคำสั่งทางช่องทางรับ แล้วก็ดำเนินงานตามคำสั่งนั้น shell ทั้งหลาย มีฟังก์ชั่นภายในที่ช่วยงานประจำวัน เช่น การจัดการแฟ้มเอกสาร การป้องกันการเขียนทับแฟ้มเอกสาร การแก้ไขคำสั่ง, ชุดคำสั่ง, และ ตัวแปรสภาพแวดล้อม FreeBSD ให้ชุดของ shell มากับระบบแล้ว เช่น sh หรือ Bourn shell, tcsh หรือ c shell ที่ได้รับการปรับปรุง shell อื่นๆอีกหลายตัว ท่านสามารถหาเอามาใช้ได้จาก ports เช่น z sh และ bash

แล้วท่านใช้ shell อะไรเป็นประจำ คำตอบ ก็ขึ้นอยู่กับว่า ท่านชอบของท่านอย่างไร ท่านก็ใช้อันนั้น ถ้าท่านเป็นคนเขียนโปรแกรมด้วย ภาษา C ท่านอาจจะชอบ shell ที่มีโครงสร้างคล้ายๆกัน เช่น tcsh ถ้าท่านมาจาก Linux หรือใหม่กับ unix ท่านอาจจะชอบ bash ก็ได้ ประเด็นอยู่ที่ว่า แต่ละ shell มีคุณสมบัติโดดเด่นจำเพาะตัว ที่อาจเหมาะ หรือ ไม่เหมาะกับสภาพแวดล้อมการทำงานของท่าน

หนึ่งในคุณสมบัติทั่วๆไปของ shell ก็คือ การช่วยเติมชื่อแฟ้มให้เต็ม โดยการเขียนชื่อแฟ้มด้วย ๓ หรือ ๔ ตัวแรก ท่านสามารถเขียนส่วนที่เหลือได้โดยง่าย เพียงแค่ กัดปุ่ม Tab ตัวอย่างเช่น ท่านมีแฟ้ม ๒ แฟ้มชื่อ foobar และ foo.bar ต้องการจะลบแฟ้ม foo.bar ดังนั้น ท่านเพียงแต่พิมพ์ที่แป้นพิมพ์ ดังนี้
rm fo[Tab] . [Tab]
shell ก็จะพิมพ์ออกมาให้เห็นดังนี้ rm foo[BEEP].bar เมื่อ [BEEP] คือเสียงจาก console ซึ่ง shell แจ้งให้เราทราบว่า ไม่สามารถเลือกชื่อแฟ้มได้ เพราะมีอยู่ ๒ แฟ้มคือ foobar และ foo.bar ที่เริ่มต้นด้วย fo แต่สามารถทำได้แค่ foo เท่านั้น ซึ่ง ถ้าเราพิมพ์ . ลงไป แล้วตามด้วยปุ่ม Tab อีกครั้งหนึ่ง shell ก็สามารถบอกได้ว่า ชื่อแฟ้มที่ท่านต้องการ คือ foo.bar และแสดงผลให้ท่านทราบทางช่องทางแสดงผล ทันที

อีกตัวอย่างหนึ่ง ของการใช้งาน shell คือการใช้ environment variable ตัวแปรนี้ คือ คู่ของ ตัวแปร/ค่า ที่เก็บไว้ในพื้นที่ของ shell พื้นที่นี้ สามารถอ่านได้จากโปรแกรมใดใด ที่ shell เรียกใช้ และมีค่าตั้งต้นต่างๆ ของโปรแกรม ตารางนี้ แสดงบางส่วนของตัวแปร และความหมายที่มี
ตัวแปร                   คำบรรยาย หรือ ความหมาย

USER ชื่อ ของผู้ที่ เข้ามาใช้งานในขณะนี้
PATH ชื่อของสารบบ ที่แยกกันด้วย : ที่ใช้สำหรับค้นหาโปรแกรม
DISPLAY ชื่อของ network ที่ภาคแสดงผลของ X11 ใช้งาน ถ้ามี
SHELL shell ปัจจุบัน
TERM ชื่อ ของ terminal ที่ผู้ใช้ ใช้งาน มีไว้สำหรับคำนวณหา ความสามารถของ terminal
TERMCAP ช่องทางในฐานข้อมูลของ การหา Esc code ของ terminal เพื่อทำฟังก์ชั่นบางอย่าง
OSTYPE ชนิดของระบบปฏิบัติการ , ตัวอย่างเช่น FreeBSD.
MACHTYPE สถาปัตยกรรม ของ หน่วยประมวลผลกลาง ที่ระบบกำลังทำงานอยู่
EDITOR ชื่อของ editor ที่ผู้ใช้ ใช้งาน.
PAGER ชื่อของ pager ที่ผู้ใช้ ใช้งาน
MANPATH รายชื่อของ สารบบ ที่แยกกันด้วย : เพื่อใช้สำหรับค้นหา หน้าช่วยเหลือ

การกำหนดค่าของตัวแปร environment นั้นต่างกันไปในแต่ละ shell ตัวอย่างเช่น ใน shell ที่ทำงานคล้ายกับภาษา C เช่น tcsh และ csh ท่านสามารถใช้คำสั่ง setenv เพื่อกำนหนดค่าตัวแปร แต่ภายใต้ Bourne shell เช่น sh และ bash ท่านต้องใช้ export เพื่อกำหนดค่าตัวแปร ตัวอย่างเช่น เพื่อกำหนดค่าตัวแปรของ EDITOR ใน tcsh และ csh ท่านต้องใช้คำสั่งผ่านแป้นพิมพ์ดังนี้ ในกรณี ที่ท่านประสงค์จะกำหนดใหม่ ให้มีค่าเป็น /usr/local/bin/emacs
% setenv EDITOR /usr/local/bin/emacs

และ ภายใต้ Bourne shell
% export EDITOR="/usr/local/bin/emacs"

shell ถือเอาว่า อักขระหลายตัว เป็น meta-characters ซึ่งแทนข้อมูลพิเศษบางตัว อย่างที่เรารู้ๆก็ได้แก่ * ซึ่งแทนจำนวนอักขระตั้งแต่ ๐ หรือมากกว่า ในชื่อแฟ้ม แลส่วนมากแล้ว ใช้กับชื่อแฟ้มนั่นแหละ ยกตัวอย่างเช่น ท่านเพียงแค่พิมพ์ * ลงไป ก็เท่ากับสั่ง ls เพราะ shell จะนำแฟ้มทุกแฟ้ม มา และแสดงทางช่องทางแสดงผล

เพื่อป้องกัน shell จากการ แทนค่า เราสามารถทำให้ อักขระพิเศษ เหล่านี้ หนีออก, escaped, ไปได้ ด้วยการใช้ \ นำหน้าอักขระพิเศษ เหล่านั้น ลองดูซิ สั่ง echo $TERM ยังผลให้ทราบว่า terminal ของท่าน กำหนดค่าตั้งต้นต่างๆไว้เช่นไร แต่ขณะเดียวกัน ถ้าท่านสั่ง echo \$TERM ท่านก็จะเห็นตัวหนังสือ $TERM ตรงๆจริงๆ


การเปลี่ยน shell
วิธีง่ายๆ คือใช้คำสั่ง chsh การวิ่ง chsh จะนำท่านเข้าสู่ editor ที่ถูกระบุโดยตัวแปรสิ่งแวดล้อม $EDITOR ซึ่งถ้าเราไม่ได้กำหนดไว้ เขาก็จะกำหนดให้เป็น vi โดยปริยาย แล้วก็เปลี่ยนบรรทัด Shell: เอาตามใจ

คำสั่งนี้มี option ให้ท่านสามารถกำหนด shell ที่ท่านต้องการได้โดยตรง โดยมิพักต้องเข้าไปใช้บริการของ $EDITOR แต่อย่างใด ง่ายๆ ตรงๆ
# chsh -s shell

เมื่อ shell คือ shell ยอดนิยมของท่าน ใจความจาก handbook จบตรงนี้ และก็ขอจบไว้สำหรับเรื่อง shell เพียงเท่านี้ด้วยเช่นกัน

View My Stats