rails para kali instalar descargar comando codigofacilito actualizar ruby-on-rails ruby bash capistrano

ruby-on-rails - para - instalar ruby on rails en windows 10



Capistrano & Bash: ignora el estado de salida del comando (7)

Acabo de redirigir STDERR y STDOUT a / dev / null, por lo que su

run "my_command"

se convierte

run "my_command > /dev/null 2> /dev/null"

esto funciona bastante bien para las herramientas estándar de Unix, donde, por ejemplo, cp o ln podría fallar, pero no desea detener la implementación en dicho error.

Estoy usando Capistrano para ejecutar una tarea remota. Mi tarea se ve así:

task :my_task do run "my_command" end

Mi problema es que si my_command tiene un estado de salida! = 0, entonces Capistrano considera que falló y sale. ¿Cómo puedo hacer que el capistrano siga funcionando cuando sale cuando el estado de salida no es 0? Cambié my_command a my_command;echo y funciona, pero se siente como un truco.


Necesitará parchar el código de Capistrano si quiere que haga cosas diferentes con los códigos de salida; está codificado para generar una excepción si el estado de salida no es cero.

Aquí está la parte relevante de lib / capistrano / command.rb. La línea que comienza con if (failed ... is the important one) Básicamente dice que si hay valores de retorno distintos de cero, genera un error.

# Processes the command in parallel on all specified hosts. If the command # fails (non-zero return code) on any of the hosts, this will raise a # Capistrano::CommandError. def process! loop do break unless process_iteration { @channels.any? { |ch| !ch[:closed] } } end logger.trace "command finished" if logger if (failed = @channels.select { |ch| ch[:status] != 0 }).any? commands = failed.inject({}) { |map, ch| (map[ch[:command]] ||= []) << ch[:server]; map } message = commands.map { |command, list| "#{command.inspect} on #{list.join('','')}" }.join("; ") error = CommandError.new("failed: #{message}") error.hosts = commands.values.flatten raise error end self end


El comando + grep + sale de cero en función de lo que encuentre. En el caso de uso, donde le importa la salida pero no le importa si está vacía, descartará el estado de salida en silencio:

run %Q{bash -c ''grep #{escaped_grep_command_args} ; true'' }

Normalmente, creo que la primera solución está bien, la haría documentarse solo si:

cmd = "my_command with_args escaped_correctly" run %Q{bash -c ''#{cmd} || echo "Failed: [#{cmd}] -- ignoring."''}


Encuentro la opción más fácil para hacer esto:

run "my_command || :"

Aviso:: es el comando NOP por lo que el código de salida simplemente se ignorará.


Para Capistrano 3, puede (como se sugiere aquí ) usar lo siguiente:

execute "some_command.sh", raise_on_non_zero_exit: false


La forma más simple es simplemente anexar verdadero al final de su comando.

task :my_task do run "my_command" end

Se convierte

task :my_task do run "my_command; true" end