В 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".
Помимо предложенного ответа, я использую следующую команду:
nohup ./scanner.py -flag1 flag1value -flag2 flag2value &
для создания нового экземпляра. Для просмотра всех запущенных экземпляров scanner.py
я использую:
ps aux | grep scanner.py
Для уничтожения конкретного экземпляра я использую:
kill -9 {PID}
, где {PID}
получается из команды ps aux
, например, kill -9 1234
Они называются операторами оболочки. Я приведу краткий обзор наиболее распространенных среди двух основных классов, управляющих операторов и операторов перенаправления , и как они работают в отношении оболочки bash.
В командном языке оболочки маркер, который выполняет функцию управления.
Это один из следующих символов:& & ();;; < newline > | | |
И | &
в bash.
A !
является не оператором управления, а зарезервированным словом . Он становится логическим оператором NOT [отрицания] внутри Арифметических выражений и внутри тестовых конструкций (при этом требуется разделитель пространства).
;
: Будет выполняться одна команда за другой, независимо от результата первой.
command1; command2
Сначала выполняется команда command1
на переднем плане, после чего выполняется команда command2
.
Новая строка, которая не находится в последовательности литерале или после определенных ключевых слов, не эквивалентна оператору точки с запятой. Список ;
разделенных простых команд по-прежнему является списком - как и в синтаксическом анализаторе оболочки, необходимо продолжать чтение простых команд, которые следуют за ;
разделенных простых команд перед выполнением, в то время как новая строка может разделить весь список команд или список списков. Разница тонкая, но сложная: учитывая, что оболочка не имеет предыдущего императива для чтения в данных, следующих за новой линией, новая линия отмечает точку, где оболочка может начать оценивать простые команды, которые она уже читала, в то время как ;
полукольца не.
&
: Будет выполнена команда в фоновом режиме, позволяющая продолжить работу в той же оболочке.
command1 & command2
Здесь command1
запускается в фоновом режиме и command2
запускается на переднем плане немедленно, не дожидаясь выхода command1
.
Новая строка после command1
является необязательной.
& &
: используются для создания списков 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
|
: оператор трубы передает выходные данные одной команды в качестве входных данных другой. Команда, созданная из оператора трубопровода, называется трубопроводом .
command1 | command2
Любой вывод, напечатанный command1
, передается в качестве ввода в command2
.
| &
: Это краткий текст для 2 > & 1 |
в bash и zsh. Он передает как стандартные выходные данные, так и стандартную ошибку одной команды в качестве входных данных другой.
command1 | & command2
;
используется исключительно для обозначения конца оператора обращения . Ksh, bash и zsh также поддерживают ; &
для перехода к следующему случаю и ; &
(не в ATT ksh), чтобы продолжить и проверить последующие случаи.
(
и )
используются для группирования команд и запуска их в субкорпусе. {
и }
также группируют команды, но не запускают их во вложенном корпусе. См. этот ответ для обсуждения различных типов скобок, скобок и фигурных скобок в синтаксисе оболочки.
В командном языке оболочки маркер, выполняющий функцию перенаправления. Это один из следующих символов:
< > > | < < > > < & > & < < - < >
Они позволяют управлять вводом и выводом команд. Они могут отображаться в любом месте простой команды или следовать команде. Перенаправления обрабатываются в порядке их появления слева направо.
<
: ввод команды.
команда < файл.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
). Это не перенаправления, а замена процесса .
В конце файла, который вы используете, есть каналы строк стиля Windows (CR) (то же самое произошло со мной с помощью Cygwin в Windows XP).
Используйте «dos2unix.exe» для исправления ошибки, и вы должны быть в порядке:
$ dos2unix.exe script.sh
dos2unix: converting file script.sh to Unix format...
Затем повторно запустите сценарий, и эти сообщения об ошибках больше не должны появляться.
-121--109287-Можно использовать что-то вроде SSHFS. Посмотрите, например:
-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
.
начинающих пользователей Unix, которые только что узнали о перенаправлении ввода-вывода ( <
и >
)
часто пробуют такие вещи, как
command … input_file > the_same_file
или
command … < file > the_same_file
или, что почти то же самое,
cat file | command … > the_same_file
( grep
, sed
, cut
, sort
и spell
являются примерами команд
, которые у людей возникает соблазн использовать в подобных конструкциях.)
Пользователи с удивлением обнаруживают, что в этих сценариях файл становится пустым.
Нюанс, который, похоже, не упоминается в другом ответе, можно найти в первом предложении раздела Redirection bash (1) ]:
Перед выполнением команды ее ввод и вывод могут быть перенаправлены с использованием специальной записи, интерпретируемой оболочкой.
Первые пять слов должны быть выделены жирным шрифтом, курсивом, подчеркнуты, увеличены, мигают, окрашены в красный цвет и отмечены значком , чтобы подчеркнуть тот факт, что оболочка выполняет запрошено перенаправление (я) перед выполнением команды . И помните также
Перенаправление вывода заставляет файл… открываться для записи…. Если файл не существует, он создается; если он существует, он обрезается до нулевого размера.
Итак, в этом примере:
список сортировки> список
оболочка открывает файл списка
для записи, усекая его
(т. Е. Отбрасывая все его содержимое) перед запуском программы sort
.
Естественно, восстановить данные невозможно.
Можно наивно ожидать, что
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
В этом блоге (редактирование файлов на месте) предлагается и объясняется
{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; он рассматривается в следующих вопросах:
iconv
заменить входной файл преобразованным выходным? shuf file> file
пустой файл? sort
дает мне пустой файл? tr
stdout в файл … и это не считая суперпользователя или Ask Ubuntu. В этот ответ я включил много информации из ответов на вышеупомянутые вопросы , но не всю. (т.е. для получения дополнительной информации прочтите перечисленные выше вопросы и их ответы.)
P.S. У меня нет связи с блогом, который я цитировал выше.