Score:5

Ubuntu Desktop: เหตุใดสคริปต์ .profile จึงถูกเรียกใช้ในเชลล์ที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบ

ธง kz

ฉันเข้าใจเกี่ยวกับความแตกต่างระหว่าง เข้าสู่ระบบแบบโต้ตอบ และ การไม่เข้าสู่ระบบแบบโต้ตอบ

ตามโพสต์ที่ยอดเยี่ยมนี้: ลำดับการโหลดไฟล์เริ่มต้น Zsh/Bash (.bashrc, .zshrc เป็นต้น) เรามีตารางต่อไปนี้

+----------------+----------+-----------+------+
| |อินเทอร์แอคทีฟ|อินเทอร์แอคทีฟ|สคริปต์|
| |เข้าสู่ระบบ |ไม่เข้าสู่ระบบ | |
+----------------+----------+-----------+------+
|/อื่นๆ/โปรไฟล์ | ก | | |
+----------------+----------+-----------+------+
|/etc/bash.bashrc| | ก | |
+----------------+----------+-----------+------+
|~/.bashrc | | ข | |
+----------------+----------+-----------+------+
|~/.bash_profile | บี1 | | |
+----------------+----------+-----------+------+
|~/.bash_login | บีทู | | |
+----------------+----------+-----------+------+
|~/.โปรไฟล์ | B3 | | |
+----------------+----------+-----------+------+
|BASH_ENV | | | ก |
+----------------+----------+-----------+------+
| | | | |
+----------------+----------+-----------+------+
| | | | |
+----------------+----------+-----------+------+
|~/.bash_logout | ค | | |
+----------------+----------+-----------+------+

ลิงค์แรกอ้างถึงโพสต์ที่ยอดเยี่ยมนี้: ทำความสะอาดการปรับแต่ง bash ซึ่งมีคำอธิบายที่ยอดเยี่ยมเกี่ยวกับ เข้าสู่ระบบแบบโต้ตอบ และ การไม่เข้าสู่ระบบแบบโต้ตอบ ดังนี้

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

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

เกี่ยวกับอดีตมันใช้งานได้จริงใน Ubuntu เซิร์ฟเวอร์ สภาพแวดล้อม - สถานที่ที่จะทำงานร่วมกับแต่ละคน ทีที จำเป็นต้องมีการเข้าสู่ระบบดังนั้นตามตาราง ~/.profile ถูกใช้ (ฉันยืนยันว่าไม่มีทั้ง ~/.bash_profile ก็ไม่เช่นกัน ~/.bash_login ไฟล์). มันใช้สำหรับ su - ผู้ใช้อื่น (มันขอรหัสผ่านของเขา/เธอ) ดังนั้นเขา/เธอเอง ~/.profile ไฟล์ถูกดำเนินการด้วย ถึงตรงนี้ฉันสบายดี

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

แต่ ทำไมถ้าถูกดำเนินการใน นั่น เทอร์มินัล:

  • สะท้อน $JAVA_HOME (กำหนดเมื่อ .ข้อมูลส่วนตัว)
  • เสียงสะท้อน $M2_HOME (กำหนดเมื่อ .ข้อมูลส่วนตัว)
  • สะท้อน $GRADLE_HOME (กำหนดเมื่อ .ข้อมูลส่วนตัว)
  • ซึ่งจาวา
  • ซึ่ง mvn
  • ซึ่งเกรด

คำสั่งทั้งหมดใช้งานได้ปกติหรือไม่

ลักษณะการทำงานเดียวกันสำหรับแท็บใหม่ (Ctrl + Shift + T) ภายในหน้าต่างเดียวกัน และ แม้กระทั่งสำหรับหน้าต่างเทอร์มินัลใหม่พร้อมกับแท็บเริ่มต้นที่ไม่ซ้ำใคร

ฉันอ่านโพสต์ต่อไปนี้:

และฉันไม่มีการตั้งค่าที่กล่าวถึง (การตั้งค่าที่สองเหมาะสำหรับ Ubuntu Desktop 18:04):

  • เดอะ .bashrc ไฟล์ไม่ได้อ้างอิงหรือจัดหาไฟล์ .ข้อมูลส่วนตัว ไฟล์
  • แก้ไข --> การตั้งค่า --> ไม่มีชื่อ -> แท็บคำสั่ง --> รันคำสั่งเป็นล็อกอินเชลล์ (มันไม่ถูกตรวจสอบ)
raj avatar
cn flag
raj
ไม่ใช่เชลล์ที่กำลังเรียกใช้งานไฟล์ `.profile` ลองแทรกคำสั่งเช่น `echo This is .profile` ลงในไฟล์ `.profile` - คุณจะไม่เห็นข้อความบนเทอร์มินัลใหม่ที่คุณเปิด และคุณ **ควร** ดูว่าเชลล์กำลังดำเนินการอยู่จริงหรือไม่ ไฟล์. **สภาพแวดล้อมเดสก์ท็อป** ของคุณ (GNOME หรืออื่นๆ) เรียกใช้ไฟล์นี้เมื่อเริ่มต้นเซสชัน จากนั้นตัวแปรสภาพแวดล้อมที่กำหนดไว้จะถูกสืบทอด (ดังที่กล่าวไว้ในคำตอบด้านล่าง) โดย **กระบวนการทั้งหมด** เริ่มต้นจากสภาพแวดล้อมเดสก์ท็อป **รวมถึงเทอร์มินัล**
Manuel Jordan avatar
kz flag
@raj ตรรกะนั้นทำลาย / ละเมิดกฎที่ระบุในตารางที่แชร์ในสองลิงก์ในคำถามของฉันหรือไม่ เมื่อมองแวบแรกดูเหมือนว่าใช่ - พฤติกรรมนั้นเกิดขึ้นในลีนุกซ์รุ่นอื่น ๆ หรือไม่?
raj avatar
cn flag
raj
ไม่มันไม่ได้ ตรรกะอ้างถึง **เรียกใช้งานไฟล์เริ่มต้นโดยเชลล์** ไฟล์ `~/.profile` **ไม่ถูกเรียกใช้โดยเชลล์** ในกรณีนี้ ทุกอย่างก็โอเค ไม่มีการกล่าวถึงข้างต้นเกี่ยวกับการเรียกใช้งานไฟล์โดยซอฟต์แวร์ **อื่นๆ** นอกเหนือจากเชลล์ นอกจากนี้ ตามที่กล่าวไว้ในความคิดเห็นแรกของคำตอบ เป็นสิ่งสำคัญที่ไฟล์ควรถูกดำเนินการโดย DE เมื่อเข้าสู่ระบบ เพราะไม่เช่นนั้นสิ่งเลวร้ายจะเกิดขึ้นในเทอร์มินัลที่เริ่มต้นจาก DE (เช่น คุณจะไม่มี `$PATH` กำหนดอย่างถูกต้อง ดังนั้นบางคำสั่งที่ทำงานเมื่อคุณเข้าสู่ระบบผ่าน ssh จะไม่ทำงานจาก DE)
Score:8
ธง cn

สคริปต์ที่เรียกใช้งานสำหรับ เปลือกเข้าสู่ระบบ (ทั้งระบบ /etc/profileสคริปต์ใด ๆ ใน /etc/profile.dท้องถิ่นของคุณ ~/.profile และไฟล์อื่นๆ ที่คุณแสดงรายการ) กำหนดสภาพแวดล้อมของผู้ใช้ปัจจุบันของคุณ - ตั้งแต่คุณเข้าสู่ระบบ

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

cc flag
แน่นอนว่าการสืบทอดเป็นกุญแจสำคัญ น่าเสียดายที่เมื่อหลายทศวรรษก่อน ผู้คนใน CDE (Common Desktop Environment) ไม่ได้รับบันทึกช่วยจำ และเทอร์มินัลโผล่ขึ้นมาจากเดสก์ท็อป (และปัญหาเดียวกันในปัจจุบันสำหรับ DE จำนวนมาก) ไม่เคยได้รับสภาพแวดล้อมของคุณเพราะ 1) ไม่ใช่คำที่ใช้เข้าสู่ระบบ และ 2 ) แยกจากกระบวนการที่ไม่ใช่ของคุณ ดังนั้นการสืบทอดจึงไม่ทำงาน ส่งผลให้ขยะจำนวนมากถูกทิ้งลงใน .bashrc แย่มากเนื่องจากสิ่งนั้นทำทุกคำสั่ง (เรียกใช้ set -xv และดูว่า bash ต้องดำเนินการอย่างไร)
Manuel Jordan avatar
kz flag
@vanadium แม้ว่าคำตอบของคุณจะถูกต้อง - ตรรกะนั้นละเมิด / ละเมิดกฎที่ระบุในตารางที่แชร์ในสองลิงก์ในคำถามของฉันหรือไม่ เมื่อมองแวบแรกดูเหมือนว่าใช่ - พฤติกรรมนั้นเกิดขึ้นในลีนุกซ์รุ่นอื่น ๆ หรือไม่?
vanadium avatar
cn flag
ตามผังงาน ไฟล์ประเภท `profile` จะถูกดำเนินการเมื่อเข้าสู่ระบบ ไม่ว่าคุณจะเข้าสู่ระบบบน TTY (เชลล์ล็อกอินแบบโต้ตอบ) หรือในสภาพแวดล้อมเดสก์ท็อป (เชลล์ล็อกอินที่ไม่ใช่แบบโต้ตอบ) นอกจากนี้ยังเรียกใช้ .bashrc ด้วยเช่นกัน เนื่องจากมาจากโปรไฟล์ หลังจากเข้าสู่ระบบ เมื่อคุณเปิดเทอร์มินัลใหม่หรือเชลล์ย่อย (เช่น ใน TTY) (เชลล์ที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบ) เฉพาะไฟล์ประเภท bashrc เท่านั้นที่จะถูกเรียกใช้
raj avatar
cn flag
raj
@vanadium ที่จริงแล้ว จากบันทึกใน `/var/log/syslog` เกี่ยวกับการเริ่มต้นเซสชัน GNOME คุณสามารถบอกได้ว่าไฟล์ `/etc/profile` และ `~/.profile` (แต่ **ไม่ใช่** `.bash_profile ` หรือ `.bash_login`) มีแหล่งที่มาอย่างชัดแจ้งโดยสคริปต์ `/etc/gdm3/Xsession` ซึ่งเรียกใช้โดย `gdm-x-session` ซึ่งเริ่มต้นโดยตรงโดย gdm หลังจากนี้ `dbus-update-activation-environment' จะถูกเรียกใช้โดย 'gdm-x-session' เพื่อส่งออกสภาพแวดล้อมไปยังกระบวนการอื่นๆ ในเซสชัน (เริ่มต้นแยกกันโดย systemd) ผ่าน D-Bus ดังนั้นนี่จึงค่อนข้างซับซ้อน แต่ไม่มีเชลล์การเข้าสู่ระบบที่เกี่ยวข้องในทุกที่
vanadium avatar
cn flag
@ray ใช่ ข้อมูลเฉพาะอาจซับซ้อนกว่านั้นแน่นอน คำถามที่นี่คือ "ทำไม .profile จึงถูกดำเนินการในเชลล์ที่ไม่ได้เข้าสู่ระบบ" - คำตอบง่ายๆ คือ - "ไม่ มันถูกดำเนินการ *ไม่* อย่างไรก็ตาม มันถูกดำเนินการมาก่อน ดังนั้นคุณจึงสืบทอดการตั้งค่านั้นในการไม่เข้าสู่ระบบของคุณ เปลือกหอย” .

โพสต์คำตอบ

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