Sono stato sorpreso di scoprire che, quando rake db:drop
(e assumedly Rails altri built-in raketasks) fallisce, il codice di stato bash è 0.Perché `rake db: drop` ha uno stato di uscita 0 e non genera alcun errore, quando fallisce?
$ rake db:drop
could not connect to server: Connection refused
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
...
$ echo $?
0
forse più sorprendente, che non ha nemmeno sollevare un errore quando l'attività è invocata dall'interno di Rails.
2.3.0 :001 > begin
2.3.0 :002 > Rake::Task["db:drop"].invoke
2.3.0 :003 > puts "After raketask invoked"
2.3.0 :004 > end
could not connect to server: Connection refused
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
...
After raketask invoked
È intenzionale? Scavando nel source, questo sembra semplicemente chiamare execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}"
. Questo dovrebbe raise an error in caso di fallimento. Cosa mi manca?
Non vuoi '$?' E non '$!'? – Shelvacu
Buona cattura, ha modificato l'errore, grazie. –
Quello che ti manca è una richiesta pull e un riferimento agli sviluppatori di Ruby come gestire gli errori in Unix come i sistemi operativi e come impostare il valore di uscita di un'applicazione CLI come rake :) – Istvan