Скрытые функции Bash

Сценарии оболочки часто используются в качестве связующего звена для автоматизации и простых одноразовых задач. Что частью Вашего фаворита являются "скрытые" функции оболочки/языка сценариев Bash?

  • Одна функция на ответ
  • Дайте пример и краткое описание функции, не только ссылку на документацию
  • Маркируйте функцию с помощью полужирного заголовка в качестве первой строки

См. также:

72
задан 7 revs, 3 users 46% 23 May 2017 в 12:17
поделиться

32 ответа

вставляют заключительный параметр предыдущей строки

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

нажатие это снова и снова для выбора более старых последних параметров.

большой, когда Вы хотите сделать что-то еще к чему-то, что Вы использовали только момент назад.

69
ответ дан 3 revs 24 November 2019 в 12:26
поделиться

Усеченное содержание файла (обнуляющий файл)

> file

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

4
ответ дан Thevs 24 November 2019 в 12:26
поделиться

C разрабатывают числовые выражения:

let x="RANDOM%2**8"
echo -n "$x = 0b"
for ((i=8; i>=0; i--)); do
  let n="2**i"
  if (( (x&n) == n )); then echo -n "1"
  else echo -n "0"
  fi
done
echo ""
3
ответ дан Steve Baker 24 November 2019 в 12:26
поделиться

Я недавно читал Csh Программирование Продуманного Вредный , который содержал этот поразительный драгоценный камень:

Рассматривают конвейер:

A | B | C

Вы хотите знать состояние C, ну, в общем, это легко: это находится в $?, или $status в csh. Но если Вы хотите его от A, Вы являетесь неудачливыми - если Вы находитесь в csh, который является. В Оболочке Bourne можно получить его, хотя выполнение так немного хитро. Вот что-то, что я должен был сделать, куда я выполнил stderr dd в grep-v канал для избавлений от записей в / шуме, но должен был возвратить статус выхода dd, не grep's:

device=/dev/rmt8
dd_noise='^[0-9]+\+[0-9]+ records (in|out)
exec 3>&1
status=`((dd if=$device ibs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) |
    egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1`
exit $status;
4
ответ дан Greg Hewgill 24 November 2019 в 12:26
поделиться

Почти все перечисленное под разделом EXPANSION в руководстве

, В частности, расширении параметра:

$ I=foobar
$ echo ${I/oo/aa} #replacement
faabar
$ echo ${I:1:2}   #substring
oo
$ echo ${I%bar}   #trailing substitution
foo
$ echo ${I#foo}   #leading substitution
bar
38
ответ дан 2 revs, 2 users 86% 24 November 2019 в 12:26
поделиться

, Если Вы хотите сохранить процесс, бегущий за Вами, выйдите из системы:

disown -h <pid>

полезный встроенный удар. В отличие от этого nohup, можно работать disown на уже рабочем процессе.

Первый, остановите свое задание с управлением-Z, получите pid от ps (или используйте echo $!), используйте bg для отправки его в фон, затем используйте disown с флагом-h.

не забывают к фону Вашего задания, или это будет уничтожено, когда Вы выйдете из системы.

40
ответ дан 2 revs 24 November 2019 в 12:26
поделиться

Возвращают команды истории и аргументы

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

можно проверить последние команды с history.

можно использовать предыдущие команды с !<n> являющийся n индекс команды в [1 110], отрицательные числа считают в обратном направлении от последней команды в истории.

ls -l foo bar
touch foo bar
!-2

можно использовать предыдущие споры с [1 111], нуль является командой,> = 1 аргументы.

ls -l foo
touch !:2
cp !:1 bar

И можно объединить обоих с [1 112]

touch foo bar
ls -l !:1 !:2
rm !-2:1 !-2:2
!-2

, можно также использовать диапазоны аргумента !<n>:<x>-<y>

touch boo far
ls -l !:1-2

Другой !, специальные модификаторы:

  • * для всех аргументов

    ls -l foo bar
    ls !*
    
  • ^ для первого аргумента (!:1 == !^)

  • $ для последнего аргумента

    ls -l foo bar
    cat !$ > /dev/null
    
24
ответ дан 2 revs, 2 users 87% 24 November 2019 в 12:26
поделиться

Мне нравится-x функция, позволяя видеть то, что продолжается в Вашем сценарии.

bash -x script.sh 
20
ответ дан stephanea 24 November 2019 в 12:26
поделиться

Используя арифметику:

if [[ $((2+1)) = $((1+2)) ]]
    then echo "still ok"
fi
5
ответ дан 2 revs 24 November 2019 в 12:26
поделиться

Регулярное выражение, обрабатывающее

, Недавний удар выпускает соответствие регулярного выражения функции, таким образом, можно сделать:

if [[ "mystring" =~ REGEX ]] ; then  
    echo match
fi

, где REGEX является необработанным регулярным выражением в формате, описанном человеком re_format.

Соответствия от любых частей на кронштейнах хранятся в массиве BASH_REMATCH, запускающийся в элементе 1 (элемент 0 является совпавшей строкой в целом), таким образом, можно использовать это, чтобы сделать regex-приводимый-в-действие парсинг также.

13
ответ дан th_in_gs 24 November 2019 в 12:26
поделиться

Случайная специальная переменная:

if [[ $(($RANDOM % 6)) = 0 ]]
    then echo "BANG"
else
    echo "Try again"
fi   
16
ответ дан Vinko Vrsalovic 24 November 2019 в 12:26
поделиться

Здесь два из моего избранного:

Для проверки синтаксиса w/o действительно выполняющий использование сценария:

bash -n script.sh

Возвращаются к последнему каталогу (да, я знаю pushd и popd, но это более быстро)

cd -
10
ответ дан 2 revs 24 November 2019 в 12:26
поделиться

Используя Инфиксные булевы операторы

Рассматривают простое если:

if [ 2 -lt 3 ]
    then echo "Numbers are still good!"
fi

, Что - Это выглядит довольно ужасным. Не очень современный. При использовании двойных скобок вокруг булева выражения, Вы можете нормальные булевы операторы!

if [[ 2 < 3 ]]
    then echo "Numbers are still good!"
fi
8
ответ дан Patrick 24 November 2019 в 12:26
поделиться

Массивы:

#!/bin/bash

array[0]="a string"
array[1]="a string with spaces and \"quotation\" marks in it"
array[2]="a string with spaces, \"quotation marks\" and (parenthesis) in it"

echo "There are ${#array[*]} elements in the array."
for n in "${array[@]}"; do
    echo "element = >>${n}<<"
done
[еще 113] детали о массивах (и другой усовершенствованный материал сценариев удара) могут быть найдены в Усовершенствованное Руководство по созданию сценариев Bash .

8
ответ дан JesperE 24 November 2019 в 12:26
поделиться

Быстрое и грязное исправление опечаток (особенно полезно для длинных команд по медленным соединениям, где используется история команд и прокрутка по ней было бы ужасно):

$ cat /proc/cupinfo
cat: /proc/cupinfo: No such file or directory
$ ^cup^cpu

Также попробуйте !: s / old / new , который один раз заменяет старый на новый в предыдущей команде.

Если вы хотите заменить много вхождений, вы можете выполнить глобальную замену с помощью !: gs / old / new .

13
ответ дан 24 November 2019 в 12:26
поделиться

These properties are another one of my favorites.

export HISTCONTROL=erasedups
export HISTSIZE=1000

The first one makes sure bash doesn't log commands more than once, will really improves history's usefulness. The other expands the history size to 1000 from the default of 100. I actually set this to 10000 on my machines.

3
ответ дан 24 November 2019 в 12:26
поделиться

СЕКУНД = 0; сон 5; echo ", которое заняло приблизительно $ SECONDS секунд"

SECONDS

Каждый раз, когда этот параметр указано количество секунд поскольку возвращается вызов оболочки. Если значение присваивается СЕКУНДАМ, значение, возвращаемое при последующих ссылки - это количество секунд так как присвоение плюс значение назначен. Если SECONDS не установлен, он теряет свои особые свойства, даже если впоследствии оно сбрасывается.

19
ответ дан 24 November 2019 в 12:26
поделиться

Вот один из моих любимых. Это устанавливает автоматическое завершение табуляции без учета регистра. Это действительно здорово для быстрого ввода путей к каталогам, особенно на Mac, где файловая система по умолчанию не чувствительна к регистру. Я поместил это в .inputrc в моей домашней папке.

set completion-ignore-case on
17
ответ дан 24 November 2019 в 12:26
поделиться

Выполнение команды перед отображением приглашения bash

Задайте команду в переменной env «PROMPT_COMMAND», и она будет запускаться автоматически перед каждым запросом. Пример:

[lsc@home]$ export PROMPT_COMMAND="date"
Fri Jun  5 15:19:18 BST 2009
[lsc@home]$ ls
file_a  file_b  file_c
Fri Jun  5 15:19:19 BST 2009
[lsc@home]$ ls

Для дураков следующего апреля добавьте "export PROMPT_COMMAND = cd" в чей-нибудь .bashrc, затем расслабьтесь и наблюдайте, как разворачивается неразбериха.

8
ответ дан 24 November 2019 в 12:26
поделиться

Ctrl x Ctrl e

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

Чтобы использовать vi в качестве редактора:

export VISUAL=vi
13
ответ дан 24 November 2019 в 12:26
поделиться

Мое любимое:

sudo !!

Повторить предыдущую команду с помощью sudo.

35
ответ дан 24 November 2019 в 12:26
поделиться

Дополнительные комбинации волшебных клавиш:

  • Ctrl + r запускает «обратный инкрементный поиск» в вашей истории команд. По мере того, как вы продолжаете вводить, он извлекает самую последнюю команду, содержащую весь введенный вами текст.

  • Tab завершает введенное вами слово, если оно недвусмысленно.

  • Tab Tab ] перечисляет все завершения для введенного вами слова.

  • Alt + * вставляет все возможные завершения, что особенно полезно, например, если вы только что ввели потенциально деструктивная команда с подстановочными знаками:

    rm -r source / d * .c Alt + *
    rm -r source / delete_me.c source / do_not_delete_me.c

  • Ctrl + Alt + e выполняет псевдоним, историю, и расширение оболочки в текущей строке. Другими словами, текущая строка отображается повторно, поскольку она будет обработана оболочкой:

    ls $ HOME / tmp Ctrl Alt + e
    ls -N - color = tty -T 0 / home / cramey

27
ответ дан 24 November 2019 в 12:26
поделиться

Комбинации волшебных клавиш из страниц bash man :

  • Ctrl + a и Ctrl + e перемещает курсор в начало и конец текущей строки соответственно.

  • Ctrl + t и Alt + t переместите символ и слово перед курсором на текущий, затем переместите курсор вперед.

  • Alt + u и Alt + l преобразовать текущее слово (от курсора до конца) в верхний и нижний регистр.

    Подсказка: Нажмите Alt + - , а затем любую из этих команд, чтобы преобразовать начало текущего слова.


Бонус человек подсказок:

  • При просмотре страниц man используйте / для поиска текста на страницах. Используйте n для перехода к следующему совпадению или N для предыдущего совпадения.

  • Ускорьте поиск определенной команды или подраздела в man ] страниц, воспользовавшись их форматированием:

    o Вместо того, чтобы набирать / history extension , чтобы найти этот раздел, попробуйте / ^ history , используя курсор ( ^ ), чтобы найти только строки, которые начинаются с "history"

    o Попробуйте / read с несколькими пробелами в начале, чтобы найти эту встроенную команду. Встроенные элементы всегда имеют отступ на страницах man .

8
ответ дан 24 November 2019 в 12:26
поделиться

На самом деле не особенность, а скорее направление: я нашел много «скрытых возможностей», секретов и различных полезных функций bash на commandlinefu.com . Многие из самых популярных ответов на эти ответы я узнал на этом сайте :)

4
ответ дан 24 November 2019 в 12:26
поделиться

export TMOUT = $ ((15 * 60))

Завершить bash через 15 минут простоя, установить 0 для отключения. Обычно я помещаю это в ~ / .bashrc в своих учетных записях root. Это удобно при администрировании ваших ящиков, и вы можете забыть выйти из системы, прежде чем уходить от терминала.

7
ответ дан 24 November 2019 в 12:26
поделиться

Замена Встроенной команды:

имя узла & & выройте +short $ (имя узла) & & выройте +short-x, $ (выройте +short $ (имя узла))

, Эта команда хороша для проверки RDNS на Вашем почтовом сервере.: P

0
ответ дан 3 revs, 2 users 76% 24 November 2019 в 12:26
поделиться

Использование встроенной команды 'let' в bash для базовой арифметики

A=10
let B="A * 10 + 1" # B=101
let B="B / 8"      # B=12, let does not do floating point
let B="(RANDOM % 6) + 1" # B is now a random number between 1 and 6

Для выполнения вычислений с плавающей запятой вы можете использовать команду «bc» (не являющуюся частью bash).

FP=`echo "scale=4; 10 / 3" | bc` # FP="3.3333"
1
ответ дан 24 November 2019 в 12:26
поделиться

We managed to get to the bottom of this, see:

Why does my STL code run so slowly when I have the debugger/IDE attached?

What happens is when you attach the debugger a different (DEBUG) memory heap is used - you can turn it off if you want.

a() { alias $1=cd\ $PWD; }

cd где-нибудь и введите a 1 . Позже, просто набрав 1 вернется в этот каталог.

3
ответ дан 24 November 2019 в 12:26
поделиться

Я часто использую! $ Для обозначения последнего слова последней команды:

$ less foobar.txt
...
# I dont want that file any more
$ rm !$
3
ответ дан 24 November 2019 в 12:26
поделиться

Bash имеет косвенное обращение к переменным:

$ foo=bar
$ baz=foo
$ echo ${!baz}
bar
2
ответ дан 24 November 2019 в 12:26
поделиться
Другие вопросы по тегам:

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