Полезные BASH фрагменты кода
У нас было это для многих других языков. Один для C/С++ был довольно популярен, так что был эквивалент для Python. Я думал, что один для BASH тоже будет интересным.
Ответы
Ответ 1
Там cd -
перейдите в ранее посещаемый каталог:
/usr/local/bin> cd /i/am/a/banana
/i/am/a/banana> cd -
/usr/local/bin>
... и тогда есть все эти полезные воплощения BASH for-loop:
for file in *.txt; do ls $file; done
for item in $(echo foo bar baz); do echo $item; done
for num in {0..9}; do echo $num; done
Ответ 2
В BASH script назначьте аргумент переменной, но укажите значение по умолчанию, если оно существует:
MYVAR=${1:-default}
$MYVAR будет содержать первый аргумент, если ему присвоено значение "default".
Ответ 3
G'day,
Мой любимый, и он применим к другим оболочкам, поддерживающим псевдонимы, является простым способом временного отключения псевдонима, добавив обратную косую черту в команду.
Итак:
alias rm='rm -i'
всегда дает вам интерактивный режим при вводе rm, вводя
\rm
в командной строке обходит псевдоним.
НТН
веселит,
Ответ 4
Это не так полезно, но действительно интересно:
history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -n | tail | sort -nr
Он печатает 10 наиболее используемых команд.
EDIT: этот вопрос действительно похож на этот.
Ответ 5
Нашел это где-то в сети давным-давно:
function bashtips {
cat <<EOF
DIRECTORIES
-----------
~- Previous working directory
pushd tmp Push tmp && cd tmp
popd Pop && cd
GLOBBING AND OUTPUT SUBSTITUTION
--------------------------------
ls a[b-dx]e Globs abe, ace, ade, axe
ls a{c,bl}e Globs ace, able
\$(ls) \`ls\` (but nestable!)
HISTORY MANIPULATION
--------------------
!! Last command
!?foo Last command containing \`foo'
^foo^bar^ Last command containing \`foo', but substitute \`bar'
!!:0 Last command word
!!:^ Last command first argument
!\$ Last command last argument
!!:* Last command arguments
!!:x-y Arguments x to y of last command
C-s search forwards in history
C-r search backwards in history
LINE EDITING
------------
M-d kill to end of word
C-w kill to beginning of word
C-k kill to end of line
C-u kill to beginning of line
M-r revert all modifications to current line
C-] search forwards in line
M-C-] search backwards in line
C-t transpose characters
M-t transpose words
M-u uppercase word
M-l lowercase word
M-c capitalize word
COMPLETION
----------
M-/ complete filename
M-~ complete user name
[email protected] complete host name
M-\$ complete variable name
M-! complete command name
M-^ complete history
EOF
}
Ответ 6
Добавьте пробел (или другой разделитель) только в том случае, если задана переменная, чтобы избежать ненужных ненужных пробелов.
$ first=Joe
$ last= # last name blank, the following echoes a space before the period
$ echo "Hello, $first $last. Welcome to..."
Hello, Joe . Welcome to...
$ echo "Hello, $first${last:+ $last}. Welcome to..."
Hello, Joe. Welcome to...
$ last=Green
$ echo "Hello, $first${last:+ $last}. Welcome to..."
Hello, Joe Green. Welcome to...
Ответ 7
Чтобы удалить каталоги .svn, вы также можете использовать комбинацию "find...- prune...- exec..." (без xargs):
# tested on Mac OS X
find -x -E . \( -type d -regex '.*/\.svn/*.*' -prune \) -ls # test
find -x -E . \( -type d -regex '.*/\.svn/*.*' -prune \) -exec /bin/rm -PRfv '{}' \;
Ответ 8
Вот еще один:
#!/bin/bash
# Shows the full path of files, good for copy pasting and for when
# listing the full paths is necessary.
# Usage: Run in the working directory (no path), otherwise takes the
# same file specification as ls.
for file in $(ls "[email protected]"); do
echo -n $(pwd)
[[ $(pwd) != "/" ]] && echo -n /
echo $file
done
Ответ 9
В начале script, который должен запускаться как root:
if [ `id -u` != 0 ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
Ответ 10
Вот хорошее выражение grep
для удаления пустых строк и строк комментариев:
grep -v '^[ \t]*$\|^[ \t]*#' /etc/ssh/sshd_config
Вышеуказанные параметры будут отображаться в sshd_config
без каких-либо помех.
Ответ 11
Мы разрабатываем веб-сайты и сохраняем код для них в SVN. При переходе на производство мы не хотим, чтобы каталоги .svn отображались. Следующий код рекурсирует каталоги и удаляет нежелательные (может использоваться для любых нежелательных каталогов). Не строго bash, но полезно тем не менее.
find . -type d -name .svn | xargs rm -rf
выполнить из самого верхнего пути в продукте... конечно, будьте осторожны, так как выполнение в неправильном месте может привести к очень плохим вещам.
Вы также можете сделать обычный файл, изменив -type d на -type f
Ответ 12
Я использую этот много в сочетании с разработкой Java:
#!/bin/sh
if [ "$1" == "" ] || [ "$2" == "" ]; then
echo "Usage jarfinder.sh "
exit
fi
SEARCH=`echo $2 | sed -e 's/[\\\/]/./g'`
echo Searching jars and zips in $1 for "$SEARCH"
find $1 -type f -printf "'%p'\n" | egrep "\.(jar|zip)'$" | sed -e "s/\(.*\)/echo \1 ; jar tvf \1 | sed -e 's\/^\/ \/' | grep -i \"$SEARCH\"/" | sh
который я сохраняю в коллекции удобных скриптов.
Я также использую этот однострочный слой:
find . -name "*.java" | xargs grep -li "yadayada"
завершите это:
find . -name "*.java" | sed -e 's+\(.*\)+echo \1 ; yada_cmd \1+' | sh
Ответ 13
!find:p ......... show last find command - not execute
# create one dir and go to
echo 'mkcd() { mkdir -p "[email protected]" && cd $_; }' >> ~/.bashrc
# backup file in single command
cp /path/too/long/to/file{,.backup}
Ответ 14
Если вам нравится иметь текущий рабочий каталог в приглашении ($PS1
), они работают в терминале с 80 столбцами и иногда работают в действительно глубоких иерархиях, вы можете получить подсказку, в которой все, кроме около 5 символов вашей линии. В этом случае полезны следующие объявления:
PS1='${PWD##$PREFIX}$ '
PREFIX='' export PREFIX
prefix () {
PREFIX="$1"
}
prefix '*/'
В вызове prefix '*/'
будет указано, что ваш запрос содержит только последний элемент каталога вашего текущего рабочего каталога (вместо полного пути). Если вы хотите увидеть весь путь, вызовите prefix
без аргументов.
Ответ 15
Мне нравится оператор backtick.
gcc `pkg-config <package> --cflags` -o foo.o -c foo.c
и
hd `whereis -b ls | sed "s/ls: //"` | head
Зная меня, я пропустил более эффективный способ "возглавить hexdump двоичного файла, который вы не знаете о местоположении... о, и, как это довольно очевидно," ls "можно поменять местами с переменной, поэтому в script он будет выглядеть примерно так:
#!/bin/bash
hd `whereis -b $1 | sed "s/$1: //"` | head
Практическая полезность вышеизложенного довольно ограничена, но он демонстрирует универсальность оператора backtick (и оболочки bash) довольно хорошо, по моему скромному мнению.
Ответ 16
Чтобы изменить все файлы в ~, принадлежащие группе vboxusers, принадлежащие группе пользователей kent, я создал что-то. Но поскольку у него была слабость в использовании xargs, я меняю его на решение, предложенное в комментарии к этому ответу:
$ find ~ -group vboxusers -exec chown kent:kent {} \;
Ответ 17
Слишком долго, чтобы включить в общую сумму, но решения Как мне манипулировать элементами $PATH в сценариях оболочки? для меня очень полезны...
Ответ 18
: > truncate-file-to-zero-bytes.txt # without changing its permissions
Смотрите: codesnippets.joyent.com/posts/show/2067
Ответ 19
Я использую этот код для отступа в четырех пробелах и копируя результат в буфер обмена в X:
cat src/Something.java | sed -e 's/^/ /g' | xsel
Теперь Something.java готов к вставке средним нажатием. Я знаю, что могу уменьшить выражение на один канал и удалить кошку, но мне это нравится, так как мне легче отредактировать начало при повторном использовании выражения.
Ответ 20
Эффективный (и интуитивно понятный) способ получить полный путь к каноническому файлу, заданный заданным файлом. Это разрешит все случаи символических ссылок, относительные ссылки на файлы и т.д.
full_path="$(cd $(/usr/bin/dirname "$file"); pwd -P)/$(/usr/bin/basename "$file")"
Ответ 21
Я использую это, чтобы запускать приложения в их собственном окне xterm (или нет) из той же самой ссылки.
#!/bin/bash
#
# cli_app launcher -- detects where u are launching from; gui/tty
#
dev=`/usr/bin/tty`
case $dev in
/dev/pts/0 | /dev/pts/1) xterm -e /home/user/bin/cli_app ;; ## opens gui terminal
*) /home/user/bin/cli_app ;; ## opens where u are
esac
# eof #