Каковы операторы управления и перенаправления оболочки?

В zsh,

alias ggg='alias -m "g*"'

Или используйте функцию, так, чтобы ggg не печатает себя:

ggg() alias -m 'g*'

Вы могли также grep вывод "псевдонима", но он не может работать правильно, если существуют некоторые многострочные псевдонимы.

С ударом Вы могли использовать этот прием:

(
   alias() { [[ $1 = g* ]] && builtin alias "${1%%=*}"; }
   eval "$(builtin alias)"
)

Причем идея состоит в том что удар alias выводы некоторый текст, который готов быть интерпретированным для репродуцирования тех же псевдонимов, чего-то как:

$ alias
alias a='foo'
alias goo='gar
baz
alias gro=grar'

Таким образом, мы действительно оцениваем его, но переопределив alias как функция, которая называет реальное alias только при передаче строка, которая запускается с "g".

265
01.09.2017, 19:32
3 ответа

Помимо предложенного ответа, я использую следующую команду:

nohup ./scanner.py -flag1 flag1value -flag2 flag2value &

для создания нового экземпляра. Для просмотра всех запущенных экземпляров scanner.py я использую:

ps aux | grep scanner.py

Для уничтожения конкретного экземпляра я использую:

kill -9 {PID}

, где {PID} получается из команды ps aux , например, kill -9 1234

-121--175524-

Они называются операторами оболочки. Я приведу краткий обзор наиболее распространенных среди двух основных классов, управляющих операторов и операторов перенаправления , и как они работают в отношении оболочки bash.

A. Операторы управления

В командном языке оболочки маркер, который выполняет функцию управления.
Это один из следующих символов:

 & & ();;; < newline > | | |

И | & в bash.

A ! является не оператором управления, а зарезервированным словом . Он становится логическим оператором NOT [отрицания] внутри Арифметических выражений и внутри тестовых конструкций (при этом требуется разделитель пространства).

A.1 Список терминаторов

  • ; : Будет выполняться одна команда за другой, независимо от результата первой.

     command1; command2
    

    Сначала выполняется команда command1 на переднем плане, после чего выполняется команда command2 .

    Новая строка, которая не находится в последовательности литерале или после определенных ключевых слов, не эквивалентна оператору точки с запятой. Список ; разделенных простых команд по-прежнему является списком - как и в синтаксическом анализаторе оболочки, необходимо продолжать чтение простых команд, которые следуют за ; разделенных простых команд перед выполнением, в то время как новая строка может разделить весь список команд или список списков. Разница тонкая, но сложная: учитывая, что оболочка не имеет предыдущего императива для чтения в данных, следующих за новой линией, новая линия отмечает точку, где оболочка может начать оценивать простые команды, которые она уже читала, в то время как ; полукольца не.

  • & : Будет выполнена команда в фоновом режиме, позволяющая продолжить работу в той же оболочке.

      command1 & command2
    

    Здесь command1 запускается в фоновом режиме и command2 запускается на переднем плане немедленно, не дожидаясь выхода command1 .

    Новая строка после command1 является необязательной.

A.2 Логические операторы

  • & & : используются для создания списков AND, они позволяют выполнять одну команду только в случае успешного выхода другой команды.

      command1 && command2
    

    Здесь command2 будет выполняться после завершения command1 и только , если command1 был успешным (если его код выхода был 0). Обе команды выполняются на переднем плане.

    Эта команда также может быть записана

    , если команда1
    затем команд2
    else false
    fi
    

    или просто , если command1; затем command2; fi , если статус возврата игнорируется.

  • | | : Используется для создания списков ИЛИ и позволяет выполнять одну команду только в случае неудачного выхода другой команды.

      command1 || command2
    

    Здесь command2 будет выполняться только в случае сбоя command1 (если возвращено состояние выхода, отличное от 0). Обе команды выполняются на переднем плане.

    Эта команда также может быть записана

    , если команда1
    тогда true
    команда else 2
    fi
    

    или более коротким способом , если! command1; затем command2; fi .

    Обратите внимание, что & & и | | являются левоассоциативными; Для получения дополнительной информации см. Приоритет логических операторов оболочки & &, | .

  • ! : Это зарезервированное слово, которое действует как оператор «не» (но должно иметь разделитель), используемое для отмены возвращаемого состояния команды - return 0, если команда возвращает ненулевое состояние, return 1, если возвращает состояние 0. Также логический NOT для утилиты test .

    ! command1
    
    [ ! a = a]
    

    И истинный оператор NOT в арифметических выражениях:

     $ echo $ (! 0)) $ ((! 23))
    1 0
    

A.3 Оператор трубы

  • | : оператор трубы передает выходные данные одной команды в качестве входных данных другой. Команда, созданная из оператора трубопровода, называется трубопроводом .

      command1 | command2
    

    Любой вывод, напечатанный command1 , передается в качестве ввода в command2 .

  • | & : Это краткий текст для 2 > & 1 | в bash и zsh. Он передает как стандартные выходные данные, так и стандартную ошибку одной команды в качестве входных данных другой.

     command1 | & command2
    

A.4 Другая пунктуация списка

; используется исключительно для обозначения конца оператора обращения . Ksh, bash и zsh также поддерживают ; & для перехода к следующему случаю и ; & (не в ATT ksh), чтобы продолжить и проверить последующие случаи.

( и ) используются для группирования команд и запуска их в субкорпусе. { и } также группируют команды, но не запускают их во вложенном корпусе. См. этот ответ для обсуждения различных типов скобок, скобок и фигурных скобок в синтаксисе оболочки.

B. Операторы перенаправления

Оператор перенаправления

В командном языке оболочки маркер, выполняющий функцию перенаправления. Это один из следующих символов:

 < > > | < < > > < & > & < < - < >

Они позволяют управлять вводом и выводом команд. Они могут отображаться в любом месте простой команды или следовать команде. Перенаправления обрабатываются в порядке их появления слева направо.

  • < : ввод команды.

     команда < файл.txt
    

    Выше будет выполнена команда для содержимого file.txt .

  • < > : то же самое, что и выше, но файл открыт в режиме чтение + запись вместо команды только чтение :

     < > file.txt
    

    Если файл не существует, он будет создан.

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

  • > : направляет выходные данные команды в файл.

     команда > out.txt
    

    Выходные данные команды сохраняются как out.txt . Если файл существует, его содержимое будет перезаписано, а если он не существует, он будет создан.

    Этот оператор также часто используется для выбора способа печати: стандартная ошибка или стандартный вывод :

     команда > out.txt 2 > error.txt
    

    В приведенном выше примере > перенаправляет стандартный вывод, а 2 > перенаправляет стандартную ошибку. Вывод также можно перенаправить с помощью 1 > , но, поскольку это значение по умолчанию, значение 1 обычно опускается и записывается просто как > .

    Таким образом, для выполнения команды на file.txt и сохранения ее выходных данных в out.txt и любых сообщений об ошибках в error.txt необходимо выполнить команду

     < file.txt > out.txt 2 > error.txt
    
  • > | : Выполняет то же самое, что и > , но перезаписывает цель, даже если оболочка настроена на отказ от перезаписи (с помощью set -C или set -o noclobber ).

     команда > | out.txt
    

    Если out.txt существует, выходные данные команды заменяют ее содержимое. Если он не существует, он будет создан.

  • > > : Выполняется то же самое, что и > , за исключением того, что при наличии целевого файла добавляются новые данные.

     команда > > out.txt
    

    Если файл out.txt существует, к нему добавляется команда после того, что уже находится в нем. Если он не существует, он будет создан.

  • & > , > & , > > & и & > > : (нестандартно). Перенаправление как стандартных ошибок, так и стандартных выходных данных, замена или добавление соответственно.

     команда & > out.txt
    

    Как стандартная ошибка, так и стандартный вывод команды будут сохранены в файле out.txt , перезаписав его содержимое или создав его, если он не существует.

     команда & > > out.txt
    

    Как указано выше, за исключением того, что при наличии out.txt к нему будут добавлены выходные данные и ошибка команды .

    Вариант & > происходит из bash , в то время как вариант > & происходит из csh (десятилетиями ранее).Они конфликтуют с другими операторами оболочки POSIX и не должны использоваться в портативных скриптах sh .

  • < < : Вот документ. Часто используется для печати многострочных строк.

      команда < < WORD
    Текст
    WORD
    

    Здесь команда принимает все до тех пор, пока не обнаружит следующее вхождение WORD , Text в приведенном выше примере в качестве ввода. Хотя WORD часто является EoF или его вариациями, это может быть любая буквенно-цифровая (и не только) строка, которая вам нравится. При кавычке WORD текст в данном документе обрабатывается буквально, и расширения не выполняются (например, для переменных). Если он не указан в кавычках, переменные будут развернуты. Дополнительные сведения см. в руководстве .

    Если вы хотите передать выходные данные команды < < WORD... WORD непосредственно в другую команду или команды, необходимо поместить канал в ту же строку, что и < < WORD , нельзя поместить его после завершения WORD или в следующую строку. Например, команда

      < < WORD | command2 | command3...
    Текст
    WORD
    
  • < < < : Здесь строки, похожие на здесь документы, но предназначенные для одной строки. Они существуют только в порту Unix или rc (где он возник), zsh, некоторых реализациях ksh, yash и bash.

     команда < < < WORD
    

    То, что задано как WORD , расширяется, и его значение передается в качестве ввода в команду . Это часто используется для передачи содержимого переменных в качестве входных данных в команду. Например:

      $ foo = "bar"
    $ sed 's/a/A/' < < < "$ foo"
    бар
    # как сокращение для стандарта:
    $ printf '% s\n' "$ foo" | sed 's/a/A/'
    бар
    # или
    sed 's/a/A/' < < EOF
    $foo
    EOF
    

Для закрытия или дублирования дескрипторов файлов можно использовать несколько других операторов ( > & - , x > & y x < & y ). Для получения более подробной информации см. соответствующий раздел руководства по оболочке ( здесь , например, для bash).

Это относится только к наиболее распространенным операторам оболочек типа Борна. Некоторые оболочки имеют несколько собственных дополнительных операторов перенаправления.

Ksh, bash и zsh также имеют конструкции < (...) , > (...) и = (...) (последняя только в zsh ). Это не перенаправления, а замена процесса .

364
27.01.2020, 19:26

В конце файла, который вы используете, есть каналы строк стиля Windows (CR) (то же самое произошло со мной с помощью Cygwin в Windows XP).

Используйте «dos2unix.exe» для исправления ошибки, и вы должны быть в порядке:

$ dos2unix.exe script.sh

dos2unix: converting file script.sh to Unix format...

Затем повторно запустите сценарий, и эти сообщения об ошибках больше не должны появляться.

-121--109287-

Можно использовать что-то вроде SSHFS. Посмотрите, например:

https://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh

-121--186959-

Дополнительные наблюдения за ; , и , ( и )

  • Обратите внимание, что некоторые команды в ответе тердона могут быть пустыми. Например, можно сказать

     command1;
    

    (без команды command2 ). Это эквивалентно команде

     1
    

    (т.е. он просто запускает command1 на переднем плане и ожидает завершения. Сопоставимо,

     command1 &
    

    (без command2 ) запустит command1 в фоновом режиме и немедленно введите другое приглашение оболочки.

  • Напротив, command1 & & , command1 | | и command1 | не имеют смысла. Если ввести одно из следующих значений, оболочка (вероятно) предполагает, что команда будет продолжена на другой строке. Появится подсказка вторичной (продолжающей) оболочки, который обычно имеет значение > и продолжает чтение. В сценарии оболочки он просто прочитает следующую строку и добавьте его к тому, что он уже прочитал.

    Примечание: некоторые версии некоторых оболочек могут рассматривать неполные команды как ошибки. В таких случаях (или, фактически, в любом случае, когда у вас есть длинная команда), в конце строки можно поместить обратную косую черту (\) чтобы сообщить оболочке продолжить чтение команды в другой строке:

     command1 & &\
    command2
    

    или

     найти начальный каталог -mindepth 3 -maxdepth 5 -iname «* .some _ extension» -type f\
    -newer some_existing_file -user fred -readable -print
    
  • Как говорит тердон, для группирования команд можно использовать ( и ) . Заявление о том, что они «не имеют реального отношения» к этой дискуссии, является дискуссионным. Некоторые команды в ответе тердона могут быть командами groups . Например,

     (command1; command2) && (command3; command4)
    

    :

    • Выполните команду command1 и дождитесь ее завершения.
    • Тогда, независимо от результата выполнения этой первой команды, выполните команду 2 и дождитесь ее завершения.
    • Если команда command2 выполнена успешно,

      • выполните команду command3 и дождитесь ее завершения.
      • Тогда, независимо от результата выполнения этой команды, выполните команду 4 и дождитесь ее завершения.

      При сбое команды command2 прекратите обработку командной строки.

  • Вне скобок, | очень плотно связывается,таким образом,

     command1 | command2 | | command3
    

    эквивалентно

     (command1 | command2) | | command3
    

    и & & и | | связываются плотнее, чем ; , поэтому

     command1 & & command2; command3
    

    эквивалентно

     (command1 & & command2); command3
    

    т.е. command3 будет выполняться независимо от статуса выхода command1 и/или command2 .

29
27.01.2020, 19:26

Предупреждение относительно '>'

начинающих пользователей Unix, которые только что узнали о перенаправлении ввода-вывода ( < и > ) часто пробуют такие вещи, как

commandinput_file > the_same_file

или

command … < file     > the_same_file

или, что почти то же самое,

cat file | command … > the_same_file

( grep , sed , cut , sort и spell являются примерами команд , которые у людей возникает соблазн использовать в подобных конструкциях.) Пользователи с удивлением обнаруживают, что в этих сценариях файл становится пустым.

Нюанс, который, похоже, не упоминается в другом ответе, можно найти в первом предложении раздела Redirection bash (1) ]:

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

Первые пять слов должны быть выделены жирным шрифтом, курсивом, подчеркнуты, увеличены, мигают, окрашены в красный цвет и отмечены значком exclamation mark in red triangle , чтобы подчеркнуть тот факт, что оболочка выполняет запрошено перенаправление (я) перед выполнением команды . И помните также

Перенаправление вывода заставляет файл… открываться для записи…. Если файл не существует, он создается; если он существует, он обрезается до нулевого размера.

  1. Итак, в этом примере:

     список сортировки> список 
     

    оболочка открывает файл списка для записи, усекая его (т. Е. Отбрасывая все его содержимое) перед запуском программы sort . Естественно, восстановить данные невозможно.

  2. Можно наивно ожидать, что

     tr "[: upper:]" "[: lower:]"  poem 
     

    может быть лучше. Поскольку оболочка обрабатывает перенаправления слева направо, она открывает стихотворение для чтения (для стандартного ввода tr ) прежде, чем он откроет его для записи (для стандартного вывода). Но это не помогает. Несмотря на то, что эта последовательность операций дает два дескриптора файла, они оба указывают на один и тот же файл. Когда оболочка открывает файл для чтения, содержимое все еще там, , но оно все еще затирается перед выполнением программы.

Итак, что с этим делать?

Решения включают:

  • Проверить, имеет ли программа, которую вы запускаете, собственную внутреннюю возможность указывать, куда идет вывод. Это часто обозначается токеном -o (или - output = ). В частности,

     sort roster -o roster 
     

    примерно эквивалентен

     sort roster> roster 
     

    , за исключением первого случая, программа sort открывает выходной файл. И он достаточно умен, чтобы не открывать выходной файл до тех пор, пока после он не прочитает все входные файлы.

    Аналогичным образом, по крайней мере, в некоторых версиях sed есть параметр -i (редактировать i n место) , который можно использовать для записать вывод обратно во входной файл (опять же, после , все входные данные были прочитаны). Редакторы, такие как ed / ex , emacs , pico и vi / ] vim позволяет пользователю редактировать текстовый файл и сохранять отредактированный текст в исходном файле. Обратите внимание, что ed (по крайней мере) можно использовать не интерактивно.

    • vi имеет связанную функцию. Если вы наберете :%! команда Введите , он запишет содержимое буфера редактирования в команду , прочитает вывод, и вставит его в буфер (заменяющий исходное содержимое).
  • Простой, но эффективный:

     команда  входной_файл >  временный_файл  && mv  временный_файл   входной_файл 

    Недостатком этого является, input_file - это ссылка, она (возможно) будет заменена отдельным файлом. Кроме того, новый файл будет принадлежать вам с защитой по умолчанию. В частности, это несет в себе риск того, что файл станет доступным для чтения всем, даже если исходный input_file не был.

    Варианты:

    • команда input_file > temp_file && cp temp_file input_file && rm temp_file
      что по-прежнему (потенциально) оставит temp_file доступным для чтения всем. Еще лучше:
    • cp input_file temp_file && command temp_file > input_file && rm temp_file
      Они сохраняют статус связи, владельца и режим (защиту) файла, потенциально за счет вдвое большего количества операций ввода-вывода. (Вам может потребоваться использовать такой вариант, как -a или -p на cp , чтобы указать ему сохранять атрибуты.)
    • command input_file > temp_file &&
      cp --attributes-only --preserve = all input_file temp_file &&
      mv temp_file input_file
      (разбит на отдельные строки только для удобства чтения) { {1}} Это сохраняет режим файла (и, если вы root, владелец), , но делает его владельцем вашего (если вы не root), и делает его новым, отдельный файл.
  • В этом блоге (редактирование файлов на месте) предлагается и объясняется

     {rm  input_file  &&  команда …>  входной_файл ; } < input_file 

    Для этого требуется, чтобы команда могла обрабатывать стандартный ввод (но почти все фильтры могут). Сам блог называет это рискованным кладжем и не рекомендует его использовать. И это также создаст новый отдельный файл (ни с чем не связанный), принадлежащий вам и с разрешениями по умолчанию.

  • В пакете moreutils есть команда под названием sponge :

     команда  input_file  | губка  the_same_file 

    См. этот ответ для получения дополнительной информации.

Вот кое-что, что стало для меня полной неожиданностью: синтаксическая ошибка говорит :

[Большинство этих решений] завершится ошибкой в ​​файловой системе, доступной только для чтения, где «только для чтения» означает, что ваш $ HOME будет доступен для записи, {{1 }} но / tmp будет только для чтения (по умолчанию). Например, если у вас Ubuntu и вы загрузились в консоль восстановления, это обычно так. Кроме того, оператор здесь-документа <<< там тоже не будет работать, поскольку он требует / tmp для чтения / напишите , потому что он также запишет туда временный файл.
(см. этот вопрос включает вывод strace 'd)

В этом случае может работать следующее:

  • Только для опытных пользователей : Если ваша команда гарантированно произведет такое же количество выходных данных , что и входные (например, sort или tr без параметра -d или -s ), вы можете попробовать
     команду  input_file  | dd of =  the_same_file  conv = notrunc 
    См. этот ответ и этот ответ для дополнительная информация, включая объяснение вышеизложенного, и альтернативы, которые работают , если ваша команда гарантированно произведет такой же объем выходных данных , как и вход или less (например, grep или cut ). У этих ответов есть то преимущество, что они не требуют свободного места (или требуют очень мало). Ответы выше в форме команда input_file > temp_file &&… четко требовать, чтобы в системе было достаточно свободного места, чтобы она могла одновременно хранить весь входной (старый) файл и выходной (новый) файл; это неочевидно для большинства другие решения (например,, sed -i и sponge ). Исключение: сортировка… | dd… , вероятно, потребуется много свободного места, потому что sort должен прочитать весь свой ввод, прежде чем он сможет записать какой-либо вывод, и, вероятно, буферизует большую часть если не все эти данные во временном файле.
  • Только для опытных пользователей:
     команда  input_file  1 <>  the_same_file 
    может быть эквивалентным ответу dd выше. Синтаксис n <> file открывает именованный файл в файловом дескрипторе n как для ввода, так и для вывода , без усечения - своего рода комбинация n < и n > . Примечание. Некоторые программы (например, cat и grep ) могут отказываться запускаться в этом сценарии , поскольку они могут обнаружить, что входные и выходные данные это один и тот же файл. См. этот ответ для обсуждения вышеизложенного, и сценария, который заставляет этот ответ работать, если ваша команда гарантированно производят тот же объем выходных данных, что и вход или меньше .
    Предупреждение: я не тестировал сценарий Питера, поэтому не ручаюсь за него.

Итак, в чем был вопрос?

Это была популярная тема на U&L; он рассматривается в следующих вопросах:

… и это не считая суперпользователя или Ask Ubuntu. В этот ответ я включил много информации из ответов на вышеупомянутые вопросы , но не всю. (т.е. для получения дополнительной информации прочтите перечисленные выше вопросы и их ответы.)

P.S. У меня нет связи с блогом, который я цитировал выше.

73
29.04.2021, 00:36

Теги

Похожие вопросы