2012-06-06 20 views
10

Jak łatwo ukryć wyniki z poleceń systemowych w ruby? Na przykład niektóre z moich skryptów działają pod kontrolą i nie chcę wyświetlać wyników pobierania.ukrywanie wyników polecenia systemu w rubinach

Dzięki!

+3

Zauważ, że curl ma już 'tryb --silent' można użyć. – Phrogz

+0

Dokładnie tego potrzebowałem. Dzięki! – dejay

+0

możliwy duplikat [Wyłączenie wyjścia polecenia uruchamianego przy użyciu metody "systemowej" podczas uruchamiania go w skrypcie ruby] (http://stackoverflow.com/questions/1960838/suppressing-the-output-of-a-ommand- run-using-system-method-while-running-it-i) –

Odpowiedz

8

Można użyć bardziej wyrafinowane popen3 mieć kontrolę nad stdin, stdout i stderr oddzielnie, jeśli chcesz:

Open3.popen3("curl...") do |stdin, stdout, stderr, thread| 
    # ... 
end 

Jeśli chcesz wyciszyć niektóre strumienie można je zignorować, lub jeśli jest to ważne, aby przekierować lub interpretować ten wynik, nadal masz to dostępne.

+3

Może być konieczne "wymaganie" open3 "". Użyj "myvarname = stdin.read", jeśli chcesz przetwarzać dane wyjściowe. – DanielaWaranie

+0

Aby używać zaawansowanych wyjść, takich jak stdin, stderr itp., Jest w porządku, ale aby uzyskać wyjście z konsoli, jest to zależność, którą można wyeliminować za pomocą np. '% x {bash-command arg1 arg2}' – siegy22

+0

@RaVeN Jedną z zalet 'popen3' lub' system' jest możliwość odpowiedniego rozbicia argumentów: 'system (" example "," --file ", user_supplied_filename)' jest bezpieczne od wstrzyknięcia powłoki. 'system (" example --file # {user_supplied_filename} ")' jest ** bardzo niebezpieczny ** i nie powinno się tego robić. – tadman

2

Najprostszym sposobem jest przekierowanie StdOut :)

system "curl ... 1>/dev/null" 
# same as 
`curl ... 1>/dev/null` 
5

najprostszych sposobów innych niż popen:

  1. użyć% x zamiast systemu. To automatycznie rura

    rval = %x{curl ...}  #rval will contain the output instead of function return value 
    
  2. rury ręcznie/dev/null. Praca w systemie UNIX jak nie Okna

    system "curl ... > /dev/null"