Zainstalowałem RubyInstaller na Windowsie i korzystam z IMAP Sync, ale muszę go użyć do synchronizacji setek kont. Gdybym mógł przekazać te zmienne za pomocą wiersza poleceń, mógłbym lepiej zautomatyzować cały proces.
# Source server connection info.
SOURCE_NAME = '[email protected]'
SOURCE_HOST = 'mail.example.com'
SOURCE_PORT = 143
SOURCE_SSL = false
SOURCE_USER = 'username'
SOURCE_PASS = 'password'
# Destination server connection info.
DEST_NAME = '[email protected]'
DEST_HOST = 'imap.gmail.com'
DEST_PORT = 993
DEST_SSL = true
DEST_USER = '[email protected]'
DEST_PASS = 'password'
ruby
command-line
Błysk
źródło
źródło
Odpowiedzi:
Coś takiego:
następnie
lub
źródło
#!/usr/bin/env ruby
na górze.rb
pliku, aby móc go uruchomić w następujący sposób:./test.rb
Nie wymyślaj koła ponownie; sprawdź fajną bibliotekę OptionParser Ruby .
Oferuje parsowanie flag / przełączników, parametrów z opcjonalnymi lub wymaganymi wartościami, może parsować listy parametrów w jedną opcję i może generować pomoc.
Ponadto, jeśli którakolwiek z przekazywanych informacji jest dość statyczna, co nie zmienia się między uruchomieniami, umieść ją w analizowanym pliku YAML. W ten sposób możesz mieć rzeczy, które zmieniają się za każdym razem w wierszu poleceń, i rzeczy, które zmieniają się czasami konfigurowane poza twoim kodem. To oddzielenie danych i kodu jest przyjemne w utrzymaniu.
Oto kilka próbek do zabawy:
To jest przykładowy plik YAML, jeśli miejsca docelowe są dość statyczne:
Umożliwi to łatwe wygenerowanie pliku YAML:
źródło
ARGV
zawiera tylko ewentualne operandy (czyli pozostałe argumenty NIE-opcja).Niestety, Ruby nie obsługuje takiego mechanizmu przekazywania, jak np. AWK:
Oznacza to, że nie można przekazać nazwanych wartości bezpośrednio do skryptu.
Korzystanie z opcji cmd może pomóc:
Ruby przechowuje wszystkie argumenty cmd w
ARGV
tablicy, sama nazwa skryptu może zostać przechwycona za pomocą$PROGRAM_NAME
zmiennej.Oczywistą wadą jest to, że zależy od kolejności wartości.
Jeśli potrzebujesz tylko przełączników boolowskich, skorzystaj z opcji
-s
interpretera Ruby:Zwróć uwagę na
--
przełącznik, w przeciwnym razie Ruby będzie narzekać na nieistniejącą opcję-agreed
, więc przekaż go jako przełącznik do wywołania cmd. Nie potrzebujesz go w następującym przypadku:Wadą jest to, że mieszasz zmienne globalne i masz tylko logiczne wartości prawda / fałsz.
Możesz uzyskać dostęp do wartości ze zmiennych środowiskowych:
Wadami są tutaj: musisz ustawić wszystkie zmienne przed wywołaniem skryptu (tylko dla twojego procesu ruby) lub wyeksportować je (powłoki jak BASH):
W tym drugim przypadku twoje dane będą czytelne dla wszystkich w tej samej sesji powłoki i dla wszystkich podprocesów, co może mieć poważne konsekwencje dla bezpieczeństwa.
A przynajmniej można wdrożyć parser opcji przy getoptlong i optparse .
Miłego hakowania!
źródło
Możesz także wypróbować
cliqr
. Jest całkiem nowy i aktywnie się rozwija. Ale są stabilne wersje gotowe do użycia. Oto repozytorium git: https://github.com/anshulverma/cliqrZajrzyj do przykładowego folderu, aby dowiedzieć się, jak go używać.
źródło
Uruchom ten kod w wierszu polecenia i wprowadź wartość N:
źródło
O ile nie jest to najbardziej trywialny przypadek, istnieje tylko jeden rozsądny sposób użycia opcji wiersza poleceń w Ruby. Nazywa się to docopt i jest tutaj udokumentowane .
To, co jest niesamowite, to prostota. Wszystko, co musisz zrobić, to podać tekst „pomocy” dla swojego polecenia. To, co tam napiszesz, zostanie automatycznie przeanalizowane przez samodzielną (!) Bibliotekę ruby.
Z przykładu :
Wyjście:
Cieszyć się!
źródło
Powinieneś spróbować klejnotu console_runner . Ten klejnot sprawia, że Twój czysty kod Ruby jest wykonywalny z wiersza poleceń. Wystarczy dodać adnotacje YARD do swojego kodu:
Następnie uruchom go z konsoli:
źródło
tl; dr
Wiem, że to jest stare, ale getoptlong nie zostało tutaj wspomniane i jest to prawdopodobnie najlepszy sposób na analizę argumentów wiersza poleceń dzisiaj.
Parsowanie argumentów wiersza poleceń
Zdecydowanie polecam getoptlong . Jest dość łatwy w użyciu i działa jak urok. Oto przykład wyodrębniony z linku powyżej
Możesz to tak nazwać
ruby hello.rb -n 6 --name -- /tmp
Co OP próbuje zrobić
W tym przypadku myślę, że najlepszą opcją jest użycie plików YAML, jak sugerowano w tej odpowiedzi
źródło
Jak delikatnie zapytał @ Yunnosch, rozwinę trochę moją sugestię.
Argumenty przekazywane do skryptu są przechowywane w
ARGV
Używanie flag eliminuje potrzebę argumentów pozycyjnych
Ale teraz musimy pobrać wartości na podstawie flag. Z Ruby można to zrobić w 1 linii:
Dekonstruujmy składnię:
Chociaż jeśli nie jest to odpowiednie rozwiązanie, chętnie dowiem się więcej o edgecases
źródło