Команды конвейеризации не работают в Python Fabric

Я пытаюсь передать несколько команд bash для извлечения имени изображения из выходных данных команды, в которой перечислены имена изображений, но она не работает - она ​​разбрызгивает большой текстовый фрагмент, где, как это делается, шаг за шагом работает.

Код с использованием конвейера:

@task
def update():
    image_name = sudo('/os-updater --list | grep X86-64_ | sed "s/XXX/UEK4/" | tail -1')
    print("IMAGE NAME: "+image_name)

Выход:

user@system:host-updater$ ./hu -R host-name update
[host-name] Executing task 'update'
[host-name] sudo: /os-updater --list | grep X86-64_ | sed "s/XXX/UEK4/" | tail -1
[host-name] out: 2018-01-11 23:33:28,628 INFO ==> os-updater 1.3.3 started
[host-name] out: 2018-01-11 23:33:28,629 INFO --listsnapshots:True
[host-name] out: 2018-01-11 23:33:28,705 INFO Exit 0
[host-name] out:   X86-64_20171201.01_UEK4
[host-name] out: 

IMAGE NAME: 2018-01-11 23:33:28,628 INFO ==> os-updater 1.3.3 started
2018-01-11 23:33:28,629 INFO --listsnapshots:True
2018-01-11 23:33:28,705 INFO Exit 0
  X86-64_20171201.01_UEK4

Done.

Код без пиплейна:

@task
def update():
    image_list = sudo("/os-updater --list")
    out = image_list.stdout
    for line in out.splitlines():
        if 'X86-64_' in line:
            image_name = line.replace("XXX", "UEK4").strip()

    print("IMAGE NAME: " + image_name)

Выход:

user@system:host-updater$ ./hu -R host-name update
[host-name] Executing task 'update'
[host-name] sudo: /os-updater --list
[host-name] out: 2018-01-11 23:36:11,752 INFO ==> os-updater 1.3.3 started
[host-name] out: 2018-01-11 23:36:11,753 INFO --listsnapshots:True
[host-name] out: 2018-01-11 23:36:11,847 INFO Exit 0
[host-name] out: Snapshots:
[host-name] out:   X86-64_20171101.01_XXX
[host-name] out:   X86-64_20171201.01_XXX
[host-name] out: Kernel trains: (XXX above)
[host-name] out:   UEK4
[host-name] out:   STOCK
[host-name] out: 

IMAGE NAME: X86-64_20171201.01_UEK4

Done.

Я не понимаю, почему работает второй способ (буквально шаг за шагом, без конвейера), но не первый возвращает много текста с именем изображения. Я перепробовал много вещей:

image_name = sudo('/opt/os-updater/bin/os-updater --list | grep X86-64_OL7_ | sed "s/XXX/UEK4/" | tail -1').stdout.strip() 

а затем запустите команду с опцией скрытия ткани, как # with hide('output','running','warnings'):, Ничего из этого не работает. Это так странно, что конвейер не работает. Любая помощь приветствуется.

1 ответ

Канал является синтаксическим элементом оболочки. Вам нужно запустить его в оболочке:

sudo("/os-updater --list | sed -n '/X86-64_/s/XXX/UEK4/p' | tail -1", shell=True)

PS: я взял на себя свободу объединить grep а также sed Команда в один.

Другие вопросы по тегам