2008-09-19 20 views
43

मैं विंडोज़ में .sh फ़ाइल पर डबल क्लिक करके सिगविन में एक लंबा rsync कमांड चलाने के लिए चाहता हूं। यह फ़ाइल की निर्देशिका में शुरू होना चाहिए (उदा।/साइग्राइव/सी/स्क्रिप्ट /) ताकि सापेक्ष पथ काम कर सकें। किसी को भी काम करने के लिए मिल गया?मैं सिगविन के साथ .sh फ़ाइलों को कैसे जोड़ सकता हूं?

नोट: मुझे अभी chere मिला है, एक सिग्विन पैकेज जो विंडोज संदर्भ मेनू (बैश प्रॉम्प्ट यहां) प्रबंधित करता है। इसमें कुछ सुराग हो सकते हैं।

उत्तर

38

ठीक है पथ बदल सुनिश्चित करें कि मेरी मशीन पर .jpg के लिए एक उदाहरण है, मैंने पाया कुछ काम करता है। व्लादिमीर के सुझाव के रूप में एक बैच फ़ाइल को जोड़ना काम नहीं करता था, लेकिन बाश तर्क महत्वपूर्ण थे।

लघु और मीठा: इस आदेश के साथ सहयोगी: "C: \ cygwin \ बिन \ bash.exe" -li "% 1"% *

लांग संस्करण यदि आप पता नहीं कैसे:

  1. एक्सप्लोरर में, उपकरण/फ़ोल्डर विकल्प/फ़ाइल प्रकार पर जाएं।
  2. मेरे पास पहले से ही बैश स्क्रिप्ट के लिए एक एसएच प्रविष्टि थी। यदि आपके पास कोई नहीं है, तो नया क्लिक करें और एक बनाने के लिए "SH" दर्ज करें।
  3. चयनित एसएच एक्सटेंशन के साथ, उन्नत क्लिक करें।
  4. "खुली" कार्रवाई चुनें और संपादित करें (या कार्रवाई बनाएं) पर क्लिक करें।
  5. यह उपयोग करने का आदेश है: "सी: \ cygwin \ bin \ bash.exe" -li "% 1"% *।ध्यान दें कि -li के बिना, यह मेरी स्क्रिप्ट पर "आदेश नहीं मिला" को पुनः प्राप्त कर रहा था।

आप भी अपनी PATHEXT वातावरण चर को एसएच जोड़ सकते हैं:

Winkey + रोकें/उन्नत/पर्यावरण चर/प्रणाली चर/PATHEXT

आपकी मदद के लिए धन्यवाद, लोग !

+0

यदि आपकी स्क्रिप्ट को कंसोल इंटरैक्शन की आवश्यकता नहीं है, तो आप साइगविन के run.exe का उपयोग कर उन्हें पूरी तरह से विंडो रहित चला सकते हैं। बस 'सी: \ cygwin \ bin \ run.exe "bash -li"% 1 "% *' –

+12

पर कमांड को बदलें किसी को भी यह पता है कि विंडोज 7 में ऐसा कैसे करें? "फ़ाइल प्रकार" विकल्प गुम है। – adib

+0

क्या वहां है हास्यास्पद एमएस कंसोल की बजाय सिगविन के कंसोल में इसे लॉन्च करने का एक तरीका है ताकि आप कॉपी और पेस्ट की तरह कुछ कर सकें? –

0

एक समाधान जो काम करता है वह .bat फ़ाइल बनाना है जो सिग्विन खोल देगा और आपकी स्क्रिप्ट निष्पादित करेगा।

@echo off 

C: 
chdir C:\cygwin\bin 

bash --login -i ./go.sh 
1

आप .sh \ CYGWIN \ usr \ बिन \ bash.exe के साथ फ़ाइलों को संबद्ध करने के लिए सक्षम होना चाहिए:

स्क्रिप्ट स्क्रिप्ट go.sh मेरे घर निर्देशिका पर स्थित निष्पादित करने के लिए। स्क्रिप्ट का अपना कार्यशील निर्देशिका को बदलने के लिए, मैं शीर्ष पर कुछ इस तरह चिपके हुए सुझाव देते हैं होगा:

cd `dirname "$0"` 
+0

$ 0 एक अच्छी अंतर्दृष्टि है, शायद, लेकिन यह मेरे लिए काम नहीं कर रहा है। मुझे लाइन 1 पर एक त्रुटि मिलती है: dirname: कमांड नहीं मिला। – Jerph

+0

काम करने के लिए 'dirname' कमांड के क्रम में, कृपया पाथ – yvolk

2

यह फ़ाइलों .sh संबद्ध नहीं करता है, लेकिन यह आप क्या चाहते हैं आप मिल सकता है। मैं cygwin.bat बैच फ़ाइल कि Cygwin बैश खोल की शुरूआत के साथ शुरू किया, और ऐसा लगता है तो संशोधित:

$ cat test.bat 
@echo off 

set MYDIR=C:\scripts 

C:\cygwin\bin\bash --login -c "cd $MYDIR && echo 'Now in' `pwd`; sleep 15" 

एक खिलौना स्क्रिप्ट है कि लेकिन आप rsync फोन या एक अलग खोल स्क्रिप्ट कॉल करने के लिए इसे संशोधित कर सकता है। मैं स्वीकार करता हूं कि अगर यह MYDIR हार्ड कोड नहीं किया गया तो यह अच्छा होगा। Probaby एक तरीका है इसे स्वचालित रूप से सेट करने के लिए मिलता है।

ओह हाँ, जब मैंने साइगविन में एक बैश खोल में .bat फ़ाइल बनाई, तो मैंने देखा कि मुझे इसे डबल-क्लिक के साथ लॉन्च करने से पहले "chmod + x test.bat" करना था। मुझे लगता है कि यह एनटीएफएस अनुमतियों को स्थापित कर रहा है। यदि आपने अभी नोटपैड का उपयोग किया है तो आपको ऐसा करने की आवश्यकता नहीं होगी।

+0

पर साइगविन \ बिन डीआईआर जोड़ें, हाँ, MYDIR को हार्ड कोडिंग एक गैर स्टार्टर है क्योंकि मैं चाहता हूं कि अन्य टीम के सदस्य एक ही स्क्रिप्ट का उपयोग करने में सक्षम हों। क्या कोई "स्वचालित रूप से इसे सेट कर सकता है"? यदि ऐसा है तो यह टिकट की तरह लगता है। इस बिंदु पर ऐसा लगता है कि हमें डॉस स्क्रिप्टिंग विशेषज्ञता की आवश्यकता है ... – Jerph

0

डॉस बॉक्स में assoc और ftype आदेशों को देखें। यहाँ

c:\>assoc .jpg 
.jpg=jpegfile 

c:\>ftype jpegfile 
jpegfile="C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE" "%1" 

assoc .sh=bashscript 

ftype bashscript="c:\cygwin\bin\bash.exe" "%1" 

आप ftype आदेश में पार्टी की योजना बनाई मिलान करने के लिए जहां cygwin स्थापित

+0

क्षमा करें, वे आदेश मेरे लिए काम नहीं करते थे। – Jerph

14

मेरा समाधान यहां है। यह मेरी * .sh स्क्रिप्ट के लिए अच्छी तरह से काम करता है चाहे वे निर्देशिका पदानुक्रम में कहां हैं। ध्यान दें कि मैं साइगपाथ पर बैश को कॉल करने से पहले साइगपाथ डायरनाम में सीडी करता हूं। यह सिर्फ काम करता है।

assoc .sh=bashscript 

ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%1")")"; bash "$(cygpath -u "%1")"' 
+0

मुझे लगता है कि यह एक अच्छा जवाब है, लेकिन मेरे पास मेरे पथ में 'assoc' या' ftpye' नहीं है। क्या मैं इसे डॉस प्रॉम्प्ट से करता हूं? –

+0

हां। विन XP में, शुरू करें-> cmd चलाएं। –

+0

मुझे ड्रैगन के जेर्फ़ के समाधान का एक कॉम्बो मिल रहा है जो मैं काम करता हूं (मैं assoc के बाद चलाता हूं)। हालांकि, मुझे एक एमएस-डॉस पथ चेतावनी मिलती है और मैं ड्रैगॉस के समाधान में स्विच करने की सोच रहा हूं। हालांकि, अंत में गायब%% है (मुझे विश्वास है) तर्क स्क्रिप्ट को पारित तर्कों की अनुमति देता है। ड्रैगॉस की स्क्रिप्ट के अंतिम भाग को बदलने के लिए कोई कारण नहीं: <...; बैश "$ (cygpath -u"% 1 ")"% * '>? – Magnus

0

मैंने अभी परेशान नहीं किया। मैंने क्रिमसन संपादक के साथ .sh फाइलें जुड़ी हैं (क्योंकि मैं वास्तव में बग्स को काम करने में उतना समय बिताता हूं क्योंकि मैं वास्तव में उन्हें चला रहा हूं)। अब फ़ाइल प्रकार> उन्नत में काम करने के लिए "खुले/संपादित करें" संयोजन को सही करने का मामला है। अगर मुझे पता था कि डीडीई कोड क्रिमसन संपादक क्या उपयोग करता है, जिससे चीजों को आसान बना दिया जाएगा; इस पोस्ट के रूप में मैं इसे खोजने में सक्षम नहीं हूं, हालांकि।

यह मुझे मेरे मैक दिनों (1 993 -2008) की याद दिलाता है जब मैं प्राथमिक ऐप्पलस्क्रिप्ट स्क्रिप्टिबिलिटी से अधिक अनुप्रयोगों को स्कैन और स्कैन करता था।

एक बैच स्क्रिप्ट बनाएं, जैसे:

BZT

+1

यह वास्तव में पूछे गए प्रश्न का उत्तर नहीं देता है ... –

0

मैं PuttyCyg (Cygwin विंडो में भयानक पोटीन) का उपयोग यहाँ कैसे यह सब चलते रहने के लिए है। मेरी मशीन पर मैं

C:\Dev\scripts\cygbashrun.bat 

इस्तेमाल किया सामग्री

SET CYGWIN=nodosfilewarning 
C:\Cygwin\bin\putty.exe -cygterm /bin/bash.exe %1 

साथ जाहिर PuttyCyg की अपनी स्थापित की रास्तों को शामिल करने के लिए अनुकूलित।

तब Windows में फ़ाइल Explorer उपकरण के लिए जाना - फ़ोल्डर विकल्प - फ़ाइल प्रकार

एक ".sh" प्रविष्टि बनाएँ अगर वहाँ पहले से ही नहीं है (या आप अपनी स्क्रिप्ट क्या पसंद पर निर्भर करता है .bash के लिए)। । फिर उन्नत ..

[वैकल्पिक कदम] चिह्न बदलने और से Cygwin आइकन का चयन अपने स्थापित

तब:

  1. न्यू ..
  2. क्रिया = भागो Bashscript ..
  3. इस कार्रवाई = सी प्रदर्शन करने के लिए इस्तेमाल किया आवेदन: \ देव \ लिपियों \ cygbashrun.bat "% 1"

निर्माण मेरे लिए एक आकर्षण की तरह: ओ)

6

मैं कुछ समय के लिए ड्रैगोज़ समाधान के साथ काम कर रहा हूं और मैं इसे सबसे अच्छा मानता हूं क्योंकि यह आपकी शैल स्क्रिप्ट के अंदर "साइगपाथ-यू" का उपयोग करने की आवश्यकता को खत्म करता है।

तब मैं .sh और .bash फ़ाइलों के लिए ड्रैग & ड्रॉप समर्थन जैसे अतिरिक्त सुविधाएं प्राप्त करना चाहता था। कुछ खोदने के बाद मैंने एक .bat लिखा जो .sh और .bash फ़ाइलों को "बैशस्क्रिप्ट" के रूप में जोड़ता है और विंडोज एक्सप्लोरर ड्रैग & उनके लिए ड्रॉप हैंडलर सक्रिय करता है। मुझे ड्रैग्स कमांड को 1 तर्क (एक शेल स्क्रिप्ट पर गिराए गए आइटम का मार्ग) को संभालने के लिए संपादित करना था।

.bat फ़ाइल मोटे तौर पर इस प्रकार है:

echo Registering .sh and .bash files as "bashscript"... 
assoc .sh=bashscript 
assoc .bash=bashscript 
echo. 
echo Setting the run command for the file type "bashscript"... 
ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%%1")")"; bash "$(cygpath -u "%%1")" "$(/argshandler.sh "%%2")"' 
echo. 
echo Activating the drag^&drop capability for "bashscript" files (only 1 dropped item 
echo will be passed to the script, multiple items are not supported yet)... 
reg add HKEY_CLASSES_ROOT\bashscript\shellex\DropHandler /v "" /t REG_SZ /d "{60254CA5-953B-11CF-8C96-00AA00B8708C}" /f 

Cygwin जड़ में "argshandler.sh" स्क्रिप्ट बस वापस पहला तर्क यह प्राप्त करता है और कुछ भी नहीं सब पर अगर वहाँ नहीं किसी भी (हैं cygpaths उदाहरण के लिए यदि आप सिर्फ एक स्क्रिप्ट फ़ाइल पर डबल क्लिक करते हैं):

#!/bin/bash 
if [ ! "$1" == "" ] 
then 
    cygpath -u "$1" 
fi 

यह सब बहुत अच्छी तरह से काम करता है। हालांकि, अभी भी कुछ कमियां है कि अच्छा होगा हल किया जाना हैं:

  • Dragos 'कमांड और इसके बारे में मेरी व्युत्पन्न असफल जब यह स्क्रिप्ट को UNC पथ, उदा पर स्थित हैं के लिए आता है \\ myserver \ myshare \ scriptfile.sh
  • केवल 1 गिराए गए आइटम को शैल स्क्रिप्ट में पास कर दिया जाएगा।
किसी तरह

, 1-गिरा-मद केवल-मुद्दे से संबंधित, तर्क हैंडलर स्क्रिप्ट को बदलने वापस की तरह

"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3" 

कुछ देने के लिए और

की तरह कुछ करने के लिए Dragos 'कमांड के सेटर बदलते
...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")' 

(ध्यान दें कि argshandler.sh भाग के चारों ओर "" चला गया है) ठीक से काम नहीं कर रहा है: यदि किसी स्क्रिप्ट पर खींचे गए कुछ आइटमों में उनके पथ में एक खाली होता है, तो कहा गया है कि पथ एकाधिक में विभाजित हो जाएंगे argume रिक्त स्थान पर एनटीएस हालांकि उनमें से प्रत्येक डबल कोट्स में संलग्न है ... अजीब।

क्या कोई कमांड लाइन पेशेवर हैं जो इन मुद्दों में से एक या दोनों को हल करने के लिए महसूस करते हैं?

1
Windows Registry Editor Version 5.00 
    ;File:ConfigureShToBeRunUnderExplorer.reg v:1.0 docs at the end 
    [HKEY_CLASSES_ROOT\Applications\bash.exe] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command] 
    @="C:\\cygwin\\bin\\bash.exe -li \"%1\" %*" 

    ; This is a simple registry file to automate the execution of sh via cygwin on windows 7, might work on other Windows versions ... not tested 
    ; you could add this setting by issueing the following command: reg import ConfigureShToBeRunUnderExplorer.reg 
    ; Note the path of your bash.exe 
    ; Note that you still have to add the .sh to your %PATHTEXT% 
      ; usage: double - click the file or reg import file 
0

मैं एक फ़ाइल प्रकार संबद्ध करने के लिए अपने दम पर एक .bat स्क्रिप्ट (दूसरे की जवाब से उत्पन्न नहीं) विकसित (जैसे * .cygwin) के रूप में, इस .bat है खोलने के लिए:

== = फ़ाइल रन पटकथा के साथ-Cygwin में एक ही dir.bat ===

@echo off 
REM Info: A script created by Johnny Wong. (last modified on 2014-7-15) 
REM It is used to pass a file argument to run a bash script file. The current directory is setting to the path of the script file for convenience. 
REM Could be copied to C:\cygwin; and then you manually associate .cygwin file extension to open with this .bat file. 
set CYGWIN=nodosfilewarning 

C:\cygwin\bin\bash --login -i -c 'cd "`dirname "%~1"`"; exec bash "%~1" %2 %3 %4 %5 %6 %7 %8 %9' 

REM finally pause the script (press any key to continue) to keep the window to see result 
pause 

=== फ़ाइल रन पटकथा के साथ-Cygwin में एक ही dir.bat ===

सिंटैक्स पर विस्तृत स्पष्टीकरण (यदि आप रुचि रखते हैं):

  1. % 1 उद्धृत किया गया है अगर फ़ाइल को इस .bat के साथ खोलने के लिए जोड़ा गया है। फ़ाइल को इस .bat पर खींचने के लिए, यह केवल "..." उद्धृत किया गया है यदि फ़ाइल के पथ में रिक्त स्थान हैं।
  2. % ~ 1 डबल उद्धरण का सफाया कर दिया है, अगर वे
  3. % P% से डबल उद्धरण आसपास के दूर करने के लिए मौजूद आसपास के साथ% 1 के रूप में एक ही है, का उपयोग for %%a in (%p%) do set p=%%~a
  4. आप स्क्रिप्ट फ़ाइल के पथ के लिए मजबूर करने "%~1" का उपयोग करना चाहिए डबल-उद्धृत, ताकि उसके फ़ोल्डर विभाजक '\' (% 1 में) को बचने वाले वर्णों के रूप में माना जाने पर बाश द्वारा हटाया नहीं जाएगा। अन्यथा, यह फ़ाइल खींचते समय काम नहीं करता है, जिसमें इसके पथ में कोई स्थान नहीं है, इस .bat पर।
  5. "exec bash" केवल "बाश" हो सकता है, पूर्व एक और बाश प्रक्रिया के लिए संसाधनों को सहेजने के लिए है।

प्राप्त है :)

1

यह आदेश मैं उपयोग कर रहा हूँ है:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"' 

यह mintty में इसे चलाता को बड़ा किया, स्क्रिप्ट किया जा रहा भाग गया (विंडोज पथ के लिए करने के लिए विंडो शीर्षक सेट यह), स्क्रिप्ट है जहां निर्देशिका है, इसे चलाता है और इसे पूरा होने के बाद खुला रहता है।

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%1")\007" && cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"' 

बैच स्क्रिप्ट आप के लिए संबद्धता निर्धारित:

शीर्षक में

विंडोज पथ:

@echo off 
assoc .sh=shellscript 
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"' 
pause 

वैकल्पिक रूप से, इस स्क्रिप्ट को cygwin पथ के लिए शीर्षक सेट हो जाएगा

और शीर्षक में साइविन मार्ग:

@echo off 
assoc .sh=shellscript 
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%%1")\007" ^&^& cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"' 
pause