vim यूनिक्स कमांड को निष्पादित नहीं कर सकता है:! शेल बदलने के कारण


8

हमारी कंपनी लाल टोपी लिनक्स प्रणाली का उपयोग करती है और सभी को / घर में एक खाता आवंटित करती है। दुर्भाग्य से, हमारी प्रणाली tsch का उपयोग कर रही है, जो मेरे लिए अनुकूल नहीं है। इसके अलावा, चूंकि मेरे पास सुपर उपयोगकर्ता की अनुमति नहीं है, इसलिए मैं अपने लिए bash बदलने के लिए chsh कमांड का उपयोग नहीं कर सकता। इससे भी बदतर, मेरे लिए ypchsh भी अनुपलब्ध है। तो, अंत में, मैं निम्नलिखित लाइनों को .cshrc में जोड़ता हूं:

    bash
    echo $0

और .bashrc को उचित रूप से कॉन्फ़िगर करें (मूल .cshrc से कॉपी करना और आवश्यक सिंटैक्स त्रुटि को ठीक करना)। अब स्पष्ट खोल बैश हो गया (जैसा कि "इको $ 0" कमांड से दिखाया जा सकता है)।

अब समस्या सामने आई:

जब मैं किसी cpp फ़ाइल (जैसे, Hello_World) को संपादित करने के लिए vim का उपयोग करता हूं, और ":! G ++ -g Hello_World.cpp -o hw.out" के लिए फ़ाइल को संकलित करने के लिए, कोई परिणाम नहीं दिखाया जाएगा, और vim को साथ छोड़ दिया जाता है "बैश" दिखाया गया है (जब एक टर्मिनल खुला होता है), लेकिन बिना किसी सामान्य "हिट" के मेरे काम में वापस आने के लिए "एक कुंजी दबाएं"। Hello_World.cpp फ़ोल्डर में, .Hello_World.cpp.swp फ़ाइल है, लेकिन hw.out नहीं है। जब Hello_World.cpp को फिर से vim किया जाता है, तो यह पता चलता है कि यह cpp फाइल खुली हुई है।

हालाँकि, अगर मैं फ़ोल्डर में cpp फ़ाइल को g + + करता हूं, लेकिन vim और: का उपयोग नहीं करता, तो, सब कुछ ठीक है। असल में, :! अब विम के लिए अवैध लगता है।

अगर मैं मूल tcsh का उपयोग करता हूं, तो सब कुछ भी ठीक है।

मैं इस जिज्ञासु त्रुटि को कैसे ठीक कर सकता हूं?

अग्रिम में आपकी मदद के लिए धन्यवाद।

किंग

BTW: मैं मुख्य रूप से HISTIGNORE और HISTCONTROL की अपनी सुविधा के कारण tcsh को पसंद करता हूं, हालांकि tcsh में histdup सेटिंग भी है।

मैंने निम्नलिखित को थोड़ा उपयोगी पाया लेकिन फिर भी अपनी समस्या के लिए संतोषजनक नहीं था।

विम के भीतर से यूनिक्स कमांड कैसे चलाएं?


chshअपने लॉगिन शेल को बदलने के लिए उपयोग करें ।
урослав Рахматуллин

जवाबों:


8

इसे अपनी .login स्क्रिप्ट में रखें:

setenv SHELL /bin/bash
exec bash -l

पहली पंक्ति शेल पर्यावरण चर सेट करती है। दूसरी पंक्ति के tcshसाथ बदलता है bash, लेकिन इसे एक लॉगिन शेल के रूप में चलाने के लिए कहता है (ताकि bashआपके .profileआदि को संसाधित करेगा )। आप -iइसे संवादात्मक बनाने के लिए एक विकल्प जोड़ सकते हैं ; यह आवश्यक नहीं होना चाहिए।


2
आप set shell=/bin/bashVIM के अंदर भी डाल सकते हैं । इस तरह, आप अपना शेल रख सकते हैं, लेकिन VIM में BASH का उपयोग करें और !मुद्दों से बचें । हालांकि, मैं देखता हूं कि ओपी वैसे भी बैश को पसंद करता है, इसलिए आपका समाधान न केवल वीआईएम मुद्दे को हल करेगा, बल्कि ओपी को अपना पसंदीदा शेल देगा।
डेविड डब्ल्यू।

आप ठीक कह रहे हैं, @ डेविड। चूंकि कोई भी व्यक्ति में अपने खोल सेट कर सकते हैं vim(या vi) जो कुछ भी करने के लिए उन्हें पसंद है, यह मूल रूप से एक प्रणाली का उपयोग प्रतिबंधित करने के लिए यदि आप करने के लिए उपयोगकर्ता उपयोग की अनुमति असंभव है viया vim। पिछले कुछ समय में, लोगों ने एक विशेष प्रोग्राम में शेल सेट करने की कोशिश की है जो केवल कुछ कमांड को निष्पादित करता है। हालांकि, अगर उन कमांड में से एक है , viया vimफिर उनके पास सिस्टम तक पहुंच है।
जोनाथन लेफ़लर

मुझे खेद है कि जैसा कि मैं इस वेबसाइट पर नौसिखिया हूं, मुझे नहीं पता कि इस उत्तर पर टिप्पणी कैसे करें। आपकी मदद के लिए बहुत बहुत शुक्रिया। @JonathanLeffler और DavidW।
JQK

2

किसी भी उपयोगकर्ता के लिए डिफ़ॉल्ट शेल / etc / passwd फ़ाइल में संग्रहीत है। उपयोगकर्ता chshकमांड जारी करके / etc / गोले में सूचीबद्ध किसी भी गोले में अपना डिफ़ॉल्ट शेल बदल सकता है । अधिक जानकारी के लिए chsh (1) और गोले (5) के मैनुअल पेज देखें।

यह उत्तर लॉगिंग के बाद वर्तमान शेल को बदलने के दृष्टिकोण से "अधिक सही" है क्योंकि पहले स्थान पर अवांछित शेल शुरू करना अनावश्यक है। यह दृष्टिकोण तभी उपयोगी है जब व्यवस्थापक ने / etc / गोले फ़ाइल को उपेक्षित कर दिया है और इसे (कभी नहीं) बैश जोड़ना भूल गया है।


हाय , पैक्स, आपके उत्तर के लिए धन्यवाद। लेकिन मुझे chsh कमांड निष्पादित करने की अनुमति नहीं है। व्यवस्थापक मेरे शेल को बदलने के लिए chsh का उपयोग नहीं करना चाहता। आप सब का धन्यवाद।
JQK

1

आपकी सभी महान मदद के लिए धन्यवाद।

मेरे द्वारा चुने गए अंतिम समाधान देने से पहले, मुझे अपने मूल प्रश्न में एक गलती की ओर इशारा करना होगा। मेरे मूल .cshrc में निम्नलिखित तीन लाइनें हैं:

     bash
     source ~/.bashrc
     echo $0

मैं पहले दूसरी पंक्ति टाइप करने से चूक गया। माफ़ करना।

अब, मैंने इन दो तरीकों की कोशिश की, और परिणाम नीचे दिखाए गए हैं।

1) .vimrc विधि

अगर मैं लिखता

     bash
     source ~/.bashrc
     echo $0

~ / .cshrc में

तथा

     set shell=/bin/bash

~ में / .vimrc

बिना किसी ~ / .login फ़ाइल के, फिर vim और:! g ++ ठीक है, लेकिन:! gdb a.out में कुछ गलती है। इसके अलावा, "इको $ 0" "बैश" देता है लेकिन "इको $ शेल" "/ बिन / टीसीएच" देता है। मैं $ 0 और $ SHELL के बीच के अंतर को ठीक से नहीं जानता।

2) .लगइन विधि

अगर मैं लिखता

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

inlogin

लेकिन न तो कुछ भी "सेट शेल = ..." में ~ / .vimrc और न ही "bash ..." ~ / .cshrc में, सब कुछ ठीक है। अब, "इको $ 0" "बैश" और "इको $ शेल" "/ बिन / बैश" देता है।

दूसरी पंक्ति के बैश को "बैश-एल" द्वारा प्रतिस्थापित किया जा सकता है। यह ध्यान दिया जाना चाहिए कि अगर मैं इसे "एग्जिट बैश" या "एग्जिट बैश-एल" से बदल देता हूं, तो मैं अपने अकाउंट में लॉग इन नहीं कर पाऊंगा। (सिस्टम स्वचालित रूप से जल्दी से बाहर निकलता है।) मुझे पता नहीं क्यों, या तो।

मुझे लगता है कि दूसरी विधि महान है। मैं आपकी मदद की बहुत सराहना करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.