Eiffel: как сделать системный вызов?

Я хочу распаковать файл с помощью bzip2 myFile.bz2 какой класс мне нужно использовать для этого?

Я попытался найти его в базовой документации по ядру, что было для меня наиболее целесообразным. и не нашел


person Pipo    schedule 22.07.2019    source источник


Ответы (2)


Это работает:

    make
        local
            l_env:EXECUTION_ENVIRONMENT
        do
            create l_env
            l_env.system ("bzip2 test.txt")
        end
person Louis M    schedule 23.07.2019
comment
вы также можете взглянуть на BASE_PROCESS для более продвинутого использования. eiffel.org/doc/solutions/Process_and_BaseProcess - person Jocelyn; 23.07.2019
comment
Кроме того, используйте полный путь к bzip2, если его нет в вашем PATH. - person Jocelyn; 30.08.2019

Мое окончательное решение, работающее на Linux с трубами, следующее:

feature -- Commands

    piped_command_result (a_command: STRING): detachable PROCESS_COMMAND_RESULT
            -- https://groups.google.com/forum/#!topic/eiffel-users/O9KEtBSPrf4
        local
            l_cmd: READABLE_STRING_32
            l_args: ARRAYED_LIST [READABLE_STRING_32]
            l_proc: like {BASE_PROCESS_FACTORY}.process_launcher
            l_err, l_res: STRING
            l_err_spec, l_res_spec: SPECIAL [NATURAL_8]
        do
            create l_res.make (0)
            create l_err.make (0)
            create l_res_spec.make_filled (0, 1024)
            create l_err_spec.make_filled (0, 1024)

            l_cmd := (create {EXECUTION_ENVIRONMENT}).default_shell
            if l_cmd.is_empty then
            l_cmd := {STRING_32} "/bin/bash" -- or either "/bin/sh"
            end
            create l_args.make (2)
            l_args.extend ("-c")
            l_args.extend (a_command)

            l_proc := (create {BASE_PROCESS_FACTORY}).process_launcher (l_cmd, l_args, Void)
            l_proc.set_hidden (True)
            l_proc.set_separate_console (False)
            l_proc.redirect_output_to_stream
            l_proc.redirect_error_to_stream

            l_proc.launch
            check
                process_launched: l_proc.launched
            then
                -- read output
                from
                until
                    l_proc.has_output_stream_closed or l_proc.has_output_stream_error
                loop
                    l_proc.read_output_to_special (l_res_spec)
                    append_special_of_natural_8_to_string_8 (l_res_spec, l_res)
                end
                -- read error
                from
                until
                    l_proc.has_error_stream_closed or l_proc.has_error_stream_error
                loop
                    l_proc.read_error_to_special (l_err_spec)
                    append_special_of_natural_8_to_string_8 (l_err_spec, l_err)
                end

                l_proc.wait_for_exit
                create Result.make (l_proc.exit_code, l_res, l_err)
            end
        ensure
            instance_free: Class
        end

feature {NONE} -- Implementation

    append_special_of_natural_8_to_string_8 (spec: SPECIAL [NATURAL_8]; a_output: STRING)
        local
            i,n: INTEGER
        do
            from
                i := spec.lower
                n := spec.upper
            until
                i > n
            loop
                a_output.append_code (spec[i])
                i := i + 1
            end
        ensure
            instance_free: Class
        end

Кредиты для пользователей групп Google eiffel

Обратите внимание, что с другим пользователем, таким как приложение, запущенное apache, вы должны проверить свои переменные среды и $PATH, чтобы оно могло работать!

person Pipo    schedule 03.12.2019