เป็นกลุ่มไม่สามารถรันคำสั่ง unix ด้วย:! เนื่องจากการเปลี่ยนแปลงของเปลือกหอย


8

บริษัท ของเราใช้ระบบลินุกซ์หมวกสีแดงและจัดสรรบัญชีให้กับทุกคนในบ้าน น่าเสียดายที่ระบบของเราใช้ tsch ซึ่งไม่เป็นที่นิยมสำหรับฉัน ยิ่งกว่านั้นเนื่องจากฉันไม่ได้รับอนุญาตจากผู้ใช้ขั้นสูงฉันไม่สามารถใช้คำสั่ง chsh เพื่อเปลี่ยนเป็นทุบตีได้ด้วยตัวเอง ยิ่งแย่ไปกว่านั้น ypchsh ก็ไม่สามารถใช้ได้สำหรับฉัน ดังนั้นในที่สุดฉันจะเพิ่มบรรทัดต่อไปนี้ใน. cshrc:

    bash
    echo $0

และกำหนดค่า. bashrc อย่างเหมาะสม (การคัดลอกจากต้นฉบับ. cshrc และแก้ไขข้อผิดพลาดทางไวยากรณ์ที่จำเป็น) ตอนนี้เปลือกที่ชัดเจนกลายเป็นทุบตี (ดังที่สามารถแสดงได้จากคำสั่ง "echo $ 0")

ตอนนี้ปัญหาเกิดขึ้น:

เมื่อฉันใช้เสียงเรียกเข้าเพื่อแก้ไขไฟล์ cpp (เช่น Hello_World) และใช้ ":! g ++ -g Hello_World.cpp -o hw.out" ในเสียงเรียกเข้าเพื่อรวบรวมไฟล์ผลลัพธ์จะไม่ปรากฏและ vim จะถูกเลิกด้วย "bash" แสดงขึ้นมา (เหมือนเมื่อเทอร์มินัลเปิดอยู่) แต่ไม่มี "กดคีย์" ตามปกติเพื่อกลับไปใช้งานของฉันเป็นกลุ่ม ในโฟลเดอร์ Hello_World.cpp มีไฟล์. Hell_World.cpp.swp แต่ไม่ใช่ hw.out เมื่อเป็นกลุ่ม Hello_World.cpp อีกครั้งปรากฎว่าไฟล์ cpp นี้เปิดขึ้นแล้ว

อย่างไรก็ตามถ้าฉัน g ++ ไฟล์ cpp ในโฟลเดอร์ แต่ไม่ได้ใช้ vim และ:! ทุกอย่างก็โอเค ในความเป็นจริง, :! ตอนนี้ดูเหมือนว่าจะผิดกฎหมายสำหรับเป็นกลุ่ม

ถ้าฉันใช้ tcsh ดั้งเดิมทุกอย่างก็โอเค

ฉันจะแก้ไขข้อผิดพลาดที่อยากรู้อยากเห็นนี้ได้อย่างไร

ขอบคุณสำหรับความช่วยเหลือของคุณล่วงหน้า

ชิง

BTW: ฉันชอบ bash to tcsh เป็นหลักเนื่องจากความสะดวกสบายของ HISTIGNORE และ HISTCONTROL แม้ว่า tcsh จะมีการตั้งค่า histdup ด้วย

ฉันพบสิ่งต่อไปนี้มีประโยชน์เล็กน้อย แต่ก็ยังไม่เป็นที่พอใจสำหรับปัญหาของฉัน

วิธีการเรียกใช้คำสั่ง Unix จากภายในเป็นกลุ่ม?


ใช้chshเพื่อเปลี่ยนเปลือกเข้าสู่ระบบของคุณ
ЯрославРахматуллин

คำตอบ:


8

ใส่สิ่งนี้ในสคริปต์ .login ของคุณ:

setenv SHELL /bin/bash
exec bash -l

บรรทัดแรกตั้งค่าตัวแปรสภาพแวดล้อม SHELL บรรทัดที่สองแทนที่tcshด้วยbashแต่บอกให้รันเป็นเชลล์ล็อกอิน (ดังนั้นbashจะประมวลผล.profileetc ของคุณ) คุณสามารถเพิ่ม-iตัวเลือกเพื่อให้มันโต้ตอบ; ไม่ควรจำเป็น


2
คุณยังสามารถใส่set shell=/bin/bashเข้าไปใน VIM ด้วยวิธีนี้คุณสามารถเก็บเปลือกของคุณ แต่ใช้ BASH ใน VIM และหลีกเลี่ยง!ปัญหา อย่างไรก็ตามฉันเห็นว่า OP ชอบ bash อยู่แล้วดังนั้นวิธีการแก้ปัญหาของคุณจะไม่เพียง แต่แก้ปัญหา VIM เท่านั้น แต่ให้ OP เชลล์ที่ต้องการ
David W.

คุณพูดถูก @DavidW เนื่องจากทุกคนสามารถตั้งเปลือกของพวกเขาในvim(หรือvi) กับสิ่งที่พวกเขาต้องการมันเป็นไปไม่ได้โดยทั่วไปเพื่อ จำกัด การเข้าถึงระบบถ้าคุณอนุญาตให้ผู้ใช้สามารถเข้าถึงหรือvi vimในอดีตผู้คนพยายามตั้งเชลล์เป็นโปรแกรมพิเศษที่รันคำสั่งบางอย่างเท่านั้น อย่างไรก็ตามหากหนึ่งในคำสั่งเหล่านั้นเป็นviหรือvimจากนั้นพวกเขาสามารถเข้าถึงระบบได้
Jonathan Leffler

ฉันรู้สึกเสียใจที่เป็นมือใหม่ในเว็บไซต์นี้ฉันไม่ทราบวิธีแสดงความคิดเห็นกับคำตอบนี้มาก่อน ขอบคุณมากสำหรับความช่วยเหลือของคุณ. @JanathanLeffler & DavidW
JQK

2

เชลล์เริ่มต้นสำหรับผู้ใช้ใด ๆ จะถูกเก็บไว้ในไฟล์ / etc / passwd ผู้ใช้สามารถเปลี่ยนเชลล์เริ่มต้นเป็นเชลล์ใด ๆ ที่อยู่ในรายการ / etc / shells โดยเรียกใช้chshคำสั่ง ดูที่หน้าคู่มือของ chsh (1) และ shells (5) สำหรับข้อมูลเพิ่มเติม

คำตอบนี้ "ถูกต้อง" มากกว่าวิธีการเปลี่ยนเชลล์ปัจจุบันหลังจากเข้าสู่ระบบเพราะไม่จำเป็นต้องเริ่มเชลล์ที่ไม่ต้องการในตอนแรก วิธีการดังกล่าวมีประโยชน์เฉพาะเมื่อผู้ดูแลระบบละเลยไฟล์ / etc / shells และลืมเพิ่ม bash ลงไป (ไม่เคย)


สวัสดี ax สันติภาพขอบคุณสำหรับการตอบกลับของคุณ แต่ฉันไม่ได้รับอนุญาตให้ดำเนินการคำสั่ง chsh ผู้ดูแลระบบไม่ต้องการใช้ chsh เพื่อเปลี่ยนเชลล์ของฉัน ขอบคุณทุกคนเหมือนกัน
JQK

1

ขอบคุณสำหรับความช่วยเหลือที่ดีทั้งหมดของคุณ

ก่อนที่จะแก้ปัญหาสุดท้ายที่ฉันเลือกฉันต้องชี้ให้เห็นข้อผิดพลาดในคำถามเดิมของฉัน .cshrc ดั้งเดิมของฉันมีสามบรรทัดต่อไปนี้:

     bash
     source ~/.bashrc
     echo $0

ฉันไม่ได้พิมพ์บรรทัดที่สองมาก่อน ขอโทษ

ตอนนี้ฉันลองทั้งสองวิธีแล้วและผลลัพธ์ก็แสดงไว้ด้านล่าง

1) .vimrc วิธี

ถ้าฉันเขียน

     bash
     source ~/.bashrc
     echo $0

ใน ~ / .cshrc

และ

     set shell=/bin/bash

ใน ~ / .vimrc

โดยไม่มีไฟล์ ~ / .login จากนั้นเป็นกลุ่มและ:! g ++ นั้นใช้ได้ แต่:! gdb a.out มีข้อผิดพลาดบางอย่าง นอกจากนี้ "echo $ 0" ให้ "bash" แต่ "echo $ SHELL" ให้ "/ bin / tcsh" ฉันไม่ทราบความแตกต่างระหว่าง $ 0 และ $ SHELL

2) .login วิธีการ

ถ้าฉันเขียน

     setenv SHELL /bin/bash
     bash
     source ~/.bashrc
     echo $0

ใน .login

แต่ไม่มีอะไรที่เหมือนกับ "set shell = ... " ใน ~ / .vimrc และ "bash ... " ใน ~ / .cshrc ทุกอย่างก็โอเค ตอนนี้ "echo $ 0" ให้ "bash" และ "echo $ SHELL" ให้ "/ bin / bash"

bash ในบรรทัดที่สองสามารถถูกแทนที่ด้วย "bash -l" ควรสังเกตว่าถ้าฉันแทนที่ด้วย "exec bash" หรือ "exec bash -l" ดังนั้นฉันจะไม่สามารถเข้าสู่บัญชีของฉันได้ (ระบบหยุดทำงานโดยอัตโนมัติอย่างรวดเร็ว) ฉันไม่รู้ว่าทำไม

ฉันคิดว่าวิธีที่สองนั้นยอดเยี่ยม ฉันขอขอบคุณความช่วยเหลือของคุณเป็นอย่างมาก

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