Bash здесь document — подавляет вывод кода на экран?

#linux #bash #shell #unix

#linux #bash #оболочка #unix

Вопрос:

Я пишу скрипт, чтобы стать пользователем (назовем его genomics) через cmd «sudo /etc /bgenomics» (это настраивается нашим администратором) и запустить некоторый код bash от имени этого пользователя, а именно запустить cmd, перехватить код выхода и выполнить соответствующее действие.

Проблема в том, что код bash внутри документа here выводится на экран, что отвлекает и выглядит действительно неэлегантно.

Вот иллюстрация:

 #!/bin/bash

name='George'

sudo /etc/bgenomics <<Q
/bin/bash
if (( 2 == 2 )); then
    echo "my name is $name"
    grep zzz /etc    # will return nothing and $? = 1
    echo $?    # this should be 1 after the above cmd
fi
Q
  

Оператор if предназначен только для того, чтобы показать, насколько он раздражает при печати.

Прямо сейчас на экран выводится все следующее:

 Script started, file is /var/tmp/genomicstraces/c060644.20140617143003.11536
Script done, file is /var/tmp/genomicstraces/c060644.20140617143003.11536
brainiac-login-02$brainiac-login-02$/bin/bash
bash-3.2$ if (( 2 == 2 )); then
> echo "my name is George"
> grep zzz /etc    # will return nothing and 0 = 1
> echo $?    # this should be 1 after the above cmd
> fi
my name is George
1
  

Единственные части, которые я хочу видеть, это «меня зовут Джордж» и «1». Можно ли это сделать?

Ответ №1:

Другой процесс вызывает этот скрипт? Вывод обычно не должен отображаться, если bash не вызывается с помощью ‘-x’. Попробуйте изменить первую строку вашего скрипта, если вы не можете отключить echo в процессе вызова:

 #!/bin/bash  x
  

Вы также можете удалить вызов /bin/bash после команды sudo, если вы действительно не хотите запускать другую оболочку в своей оболочке.

Комментарии:

1. Я запускаю этот скрипт непосредственно из строки cmd. Нет разницы с x . Я вызываю bash явно, потому что моя оболочка по умолчанию — csh.

Ответ №2:

Документ here предоставляет bgenomics скрипту входные данные через его стандартный ввод. То, что происходит с этим вводом, зависит от этого сценария.

Если вы хотите, чтобы скрипт печатал часть своих входных данных, а не печатал часть своих входных данных, вам нужно изменить сценарий.

Если bgenomics на самом деле это оболочка для сеанса интерактивной оболочки (как кажется, судя по Script started Script done следам и), то here documents — не лучший способ ввода в него входных данных.

Хороший способ — использовать expect утилиту, которая управляет интерактивными программами через псевдотерминальное устройство и предоставляет язык сценариев с большим контролем. expect может подавлять все нежелательные входные данные из интерактивной программы. Он может искать конкретные выходные данные из программы и предоставлять ответы. Например, он может искать login: строку, поступающую из интерактивного сеанса, и отправлять имя пользователя.

Ответ №3:

В программе bgenomics есть вызов script для записи того, что сделал скрипт. Поговорите с ответственным за это лицом, чтобы понять, каковы их намерения. Пока вы не поймете цель bgenomics , вы рискуете испортить то, что пытается сделать автор этого.

 $ script /tmp/junk.txt
Script started, file is /tmp/junk.txt
$ date            # this is a child shell of the script command
Tue Jun 17 21:04:14 EDT 2014
$ exit
Script done, file is /tmp/junk.txt