Score:1

มีปัญหาในการทำความเข้าใจตัวแปรและคำสั่งพื้นฐานเนื่องจากความเข้าใจในสภาพแวดล้อม Linux

ธง cn

ฉันมีปัญหาในการทำความเข้าใจแนวคิดพื้นฐานบางอย่างเกี่ยวกับ Linux และอิทธิพลของตัวแปรบางอย่างต่อแนวคิดเหล่านั้น

แนวคิดพื้นฐานเหล่านั้นคือสภาพแวดล้อมเสมือน, เชลล์, tty

ตัวแปร: $PS1 $ภาษา

คำสั่ง:

ส่งออก (ส่งออกตัวแปรจากเชลล์หนึ่งไปยังอีกเชลล์หนึ่งหรือไม่ สิ่งนี้ใช้ได้กับ tty และสภาพแวดล้อมเสมือนจริงหรือไม่ หากฉันเปิดแท็บใหม่ใน Ubuntu (tty? terminal?) มันจะไม่ส่งออกไปยังอีกอันหนึ่ง ?

env -i ?

ฉันคิดว่าปัญหาทั้งหมดเหล่านี้เกี่ยวข้องกับความเข้าใจพื้นฐานของฉันเกี่ยวกับเชลล์ สภาพแวดล้อมเสมือนจริง และ tty's

ซึ่งไม่ดีในขณะนี้

ดังนั้นฉันหวังว่าจะมีใครสักคนใจดีอธิบายเรื่องนี้ให้ฉันฟัง

Artur Meinild avatar
vn flag
ยินดีต้อนรับ! ในการสร้างโพสต์ถามตอบที่ดี คุณควรเน้นคำถามไปที่หัวข้อเดียวเท่านั้น นอกจากนี้ คุณยังสามารถไปได้ไกลมากด้วยการค้นหาคำถามบางข้อของคุณทางอินเทอร์เน็ต - คำตอบอยู่ที่นั่นแล้ว
Satoshi Nakamoto avatar
lc flag
`tty` ไม่ใช่เชลล์ แต่เป็นรูปแบบการสื่อสารเช่นเดียวกับเทลเน็ต
Satoshi Nakamoto avatar
lc flag
https://unix.stackexchange.com/questions/4126/what-is-the-exact-difference-between-a-terminal-a-shell-a-tty-and-a-con
Satoshi Nakamoto avatar
lc flag
ฉันต้องตั้งค่าสถานะคำถามนี้ (หลังจากที่ฉันโหวตแล้ว) เนื่องจากคำถามส่วนใหญ่ของคุณ (คุณทำไว้ 6 ข้อ) นั้นซ้ำกันอยู่แล้วคุณควรค้นคว้าก่อนใน Stack คำถามเหล่านั้นทั้งหมด เพื่อหาคำตอบของคุณก่อนที่จะถามคำถามใหม่ คำถามของคุณควรเป็นคำถามใหม่ (หรือหากปัญหาของคุณไม่สามารถแก้ไขได้และเป็นปัญหาเฉพาะเจาะจง ควรเป็นคำถามอื่น)
Score:1
ธง cn

เดอะ เปลือก เป็นล่ามบรรทัดคำสั่งที่แปลคำสั่งที่ป้อนโดยผู้ใช้เป็นการดำเนินการที่ระบบปฏิบัติการจะดำเนินการ เชลล์สามารถเริ่มต้นด้วยวิธีโต้ตอบ (ซึ่งผู้ใช้สามารถพิมพ์และดำเนินการคำสั่ง) หรือไม่ใช่วิธีโต้ตอบ (แยกโดยสคริปต์หรือโปรแกรมเช่น crontabฯลฯ).

เชลล์แบบโต้ตอบเริ่มต้นภายในเทอร์มินัลอีมูเลเตอร์ ซึ่งอ้างถึงแอปพลิเคชัน GUI เป็น คำพังเพย-terminal, เอ็กซ์เทอมฯลฯ หรือภายใน TTY ซึ่งอ้างถึงคอนโซลข้อความเสมือน TTY สามารถเข้าถึงได้โดยการกดคีย์ผสม Ctrl Alt F1-9. ในการแจกแจงเดสก์ท็อปของ Linux สภาพแวดล้อมเดสก์ท็อปกำลังทำงานภายในหนึ่งใน TTY เหล่านี้

อ้างอิง:

ไม่ว่าจะเป็นเทอร์มินัลอีมูเลเตอร์หรือ TTY คุณก็สามารถทำสิ่งเดียวกันได้โดยมีเชลล์ทำงานอยู่ข้างใน


เชลล์ของผู้ใช้เริ่มต้นใน Ubuntu คือ ทุบตี. มีการเรียกใช้ไฟล์เริ่มต้น .bashrc ซึ่งอยู่ในโฮมไดเร็กทอรีของผู้ใช้ ไฟล์นี้ (พร้อมกับไฟล์เริ่มต้นระบบอื่นๆ เช่น /etc/bash.bashrc) เป็น ที่มา เมื่อผู้ใช้เปิดเชลล์แบบโต้ตอบใหม่ ดังนั้นสภาพแวดล้อมเริ่มต้นของผู้ใช้จึงถูกสร้างขึ้น

แท้จริงโดยการจัดหา .bashrc ตัวแปรสภาพแวดล้อมบางตัวได้รับค่าบางอย่าง ตัวแปรสภาพแวดล้อมดังกล่าวคือ:

ดังนั้นหากคุณต้องการเปลี่ยนตัวแปรสภาพแวดล้อมบางอย่างอย่างถาวร (ภายใน Bash shell ของผู้ใช้) คุณสามารถแก้ไข (หรือตั้งค่า) ค่าของมันได้ภายใน .bashrc. มิฉะนั้น การเปลี่ยนแปลงจะมีผลกับอินสแตนซ์ปัจจุบันของเชลล์เท่านั้น

เช่น เปิดเทอร์มินัลใหม่แล้วพิมพ์ PS1='พร้อมท์_เปลี่ยน->' และพรอมต์ของคุณจะเปลี่ยนเป็นสตริงนั้น จากนั้นเปิดหน้าต่างเทอร์มินัลค้างไว้และเปิดเทอร์มินัลใหม่ - คุณจะเห็นว่าการเปลี่ยนแปลงนี้ไม่ได้มีผล ในการกู้คืนเทอร์มินัลแรก คุณสามารถจัดหาด้วยตนเองได้ .bashrc ไฟล์ตามคำสั่ง . ~/.bashrc.


เมื่อคุณใช้ ส่งออก คำสั่งที่คุณกำลังส่งออกตัวแปรไปยัง เปลือกย่อย ที่แยกจากเชลล์ปัจจุบัน (เชลล์ลูก) ไม่ใช่เชลล์อื่น (พี่น้อง) ที่สร้างโดยกระบวนการพาเรนต์ของเชลล์ปัจจุบันนี่คือตัวอย่าง:

user@host:~$ VAR='สวัสดี!' # กำหนดตัวแปรที่เรียกว่า VAR
user@host:~$ echo $VAR # ส่งออกค่าของตัวแปร
สวัสดี!
user@host:~$ ส่งออก VAR # ส่งออกตัวแปร
user@host:~$ bash # แยก bash shell ใหม่
user@host:~$ echo $VAR # ส่งออกค่าของตัวแปรที่ส่งออก
สวัสดี!
user@host:~$ exit # ออกจากพาเรนต์เชลล์
user@host:~$sh # แยกเปลือก sh (เส้นประ) ใหม่
$ echo $VAR # ส่งออกค่าของตัวแปรที่ส่งออก
สวัสดี!

คำสั่ง สิ่งแวดล้อม ใช้เพื่อเปลี่ยนสภาพแวดล้อมของคำสั่งหรือการดำเนินการสคริปต์ นี่คือบางบรรทัดจาก ผู้ชาย:

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

-ผม เรียกใช้ยูทิลิตี้ด้วยสภาพแวดล้อมที่ระบุโดยอาร์กิวเมนต์ สภาพแวดล้อมที่สืบทอดมาจะถูกละเว้นโดยสิ้นเชิง

คำสั่งต่อไปนี้: env -i PATH=/mybin mygrep xyz myfile เรียกใช้คำสั่ง ไมเกรป กับใหม่ เส้นทาง ค่าเป็นรายการเดียวในสภาพแวดล้อม ในกรณีนี้, เส้นทาง ใช้เพื่อค้นหา ไมเกรปซึ่งจะต้องอาศัยอยู่ใน /มายบิน.

สิ่งแวดล้อม มักใช้ที่จุดเริ่มต้นของสคริปต์ (ภายในสิ่งที่เรียกว่า shebang) เพื่อเพิ่มความสะดวกในการพกพา นี่คือสองหัวข้อที่ครอบคลุมการใช้งานนี้:

เมื่อทำงานโดยไม่มีข้อโต้แย้ง the สิ่งแวดล้อม คำสั่งส่งออกรายการของตัวแปรสภาพแวดล้อม


อีกครั้งที่ .bashrc ไฟล์ในโฮมไดเร็กทอรีปรับแต่งคุณลักษณะของเชลล์ เช่น การสร้างหรือแก้ไขตัวแปรและนามแฝง และการกำหนดฟังก์ชัน

ตัวอย่างเช่น ลองกำหนดฟังก์ชันต่อไปนี้ที่ด้านล่างของ .bashrc ไฟล์.

สวัสดี () { echo "สวัสดี ${USER^}!"; }

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

spas@host:~$ สวัสดี
สวัสดี สปา!

ดังนั้นเราจึงเห็นฟังก์ชันนี้ (หรือตัวแปรหรือนามแฝง) มีอยู่ในเชลล์ปัจจุบัน ในขั้นนี้เรียกว่า ท้องถิ่น ฟังก์ชั่น (หรือตัวแปรหรือนามแฝง) ดังนั้นหากเราตรวจสอบสภาพแวดล้อมโดย env | สวัสดี หน้าที่ของเราจะไม่อยู่ที่นั่น ตัวแปรโลคัลมีอยู่เฉพาะในเชลล์ปัจจุบัน และไม่สามารถส่งผลกระทบต่อคำสั่งหรือแอ็พพลิเคชันอื่นๆ

หลังจากกำหนดฟังก์ชั่น (ตัวแปร, นามแฝง) ใน .bashrc เราสามารถส่งออกเพื่อให้พร้อมใช้งานสำหรับเชลล์ย่อย (คำสั่งหรือสคริปต์) ที่แยกจากเชลล์ปัจจุบัน - ดังนั้นจึงกลายเป็น ทั่วโลก หรือ สิ่งแวดล้อม ฟังก์ชัน (ตัวแปรนามแฝง)

สวัสดี () { echo "สวัสดี ${USER^}!"; }
ส่งออก -f สวัสดี
spas@host:~$ source ~/.bashrc # ใน bash 'source' คือบทสรุปของ '.'
spas@host:~$env | grep 'hello' # แยกวิเคราะห์ 'hello' ภายในผลลัพธ์ของ 'env'
BASH_FUNC_hello%%=() { echo "สวัสดี ${USER^}!"
spas@host:~$ bash -c 'hello' # แยกเชลล์ย่อยที่ไม่ใช่แบบโต้ตอบ
สวัสดี สปา! #และดำเนินการฟังก์ชั่นภายใน

โปรดทราบว่าในกรณีส่วนใหญ่เชลล์ที่ไม่ใช่แบบโต้ตอบไม่ได้มาจากค่าเริ่มต้นของไฟล์การกำหนดค่าเริ่มต้นเป็น .bashrcดังนั้นสภาพแวดล้อมของพวกมันจึงถูกจำกัดมากกว่าสภาพแวดล้อมของเชลล์แบบโต้ตอบ

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

Satoshi Nakamoto avatar
lc flag
คำตอบของคุณไม่ตอบว่า "ฉันไม่เข้าใจเชลล์ใน tty's..." แต่ตอบว่า "ฉันไม่เข้าใจ.. ($PS1, ส่งออก, env, $LANG)" จากนั้นฉันก็โหวตขึ้น แต่คำถามนี้จำเป็นต้อง จดจ่อ มีคำตอบสำหรับ tty อยู่แล้วใน Stack
Satoshi Nakamoto avatar
lc flag
เขาตั้งคำถามที่แตกต่างกัน 6 ข้อ: 1. จุดประสงค์ของ PS1 คืออะไร (มีรายละเอียดทางเทคนิคมากมายเกี่ยวกับหัวข้อนี้) 2. เริ่ม virtual shell ที่สองใน tty เดียวกัน 3. ฉันสามารถส่งออกตัวแปรไปยังเชลล์อื่นๆ ภายในเชลล์แรกได้ 4. คุณสามารถใช้คำสั่ง env เพื่อตั้งค่า $LANG... 5. จริงๆแล้ว env -i ทำอะไรได้บ้าง? 6. ความเข้าใจพื้นฐานของเชลล์และ tty's

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา