NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
При выполнении команд иногда я захочу выполнить команду с предыдущими аргументами. Чтобы сделать это, можно использовать этот ярлык:
$ mkdir /tmp/new
$ cd !!:*
Иногда, вместо использования находят, я буду выход короткий цикл, если я должен выполнить набор команд в списке файлов.
for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;
Конфигурирование опций истории командной строки в моем .bash_login (или .bashrc) действительно полезно. Следующее является кадрами настроек, которые я использую на своем MacBook Pro.
Установка следующего заставляет удар стереть дублирующиеся команды в Вашей истории:
export HISTCONTROL="erasedups:ignoreboth"
я также поднимаю свою историю, оценивают довольно высоко также. Почему нет? Это, кажется, ничего не замедляет на сегодняшних микропроцессорах.
export HISTFILESIZE=500000
export HISTSIZE=100000
Другая вещь, которую я делаю, игнорируют некоторые команды из моей истории. Никакая потребность помнить команду выхода.
export HISTIGNORE="&:[ ]*:exit"
Вы определенно хотите установить histappend. Иначе удар перезаписывает Вашу историю, когда Вы выходите.
shopt -s histappend
Другая опция, которую я использую, является cmdhist. Это позволяет Вам сохранить многострочные команды к истории как одна команда.
shopt -s cmdhist
Наконец, на Mac OS X (если Вы не используете vi режим), Вы захотите сбросить < CTRL>-S от того, чтобы быть остановкой прокрутки. Это предотвращает удар от способности интерпретировать его как вперед поиск.
stty stop ""
Переименование/перемещение файлов с суффиксами быстро:
cp /home/foo/realllylongname.cpp{,-old}
Это расширяется до:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old
$ touch {1,2}.txt
$ ls [12].txt
1.txt 2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007 touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done
Я всегда был неравнодушен к:
ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line
я также использую shopt -s cdable_vars
, тогда можно создать переменные удара к общим каталогам. Так, для исходного дерева моей компании я создаю набор переменных как:
export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"
тогда я могу измениться на тот каталог на cd Dcentmain
.
Один предпочтительный способ перейти, когда я использую несколько каталогов в широко отдельных местах в древовидной иерархии, состоит в том, чтобы использовать (упомянутый ниже) acf_func.sh. После того, как определенный, можно сделать
CD -
для наблюдения списка недавних каталогов с числовым CD меню
-2
для движения во второй новый каталог.
Очень простой в использовании, очень удобный.
Вот код:
# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain
cd_func ()
{
local x2 the_new_dir adir index
local -i cnt
if [[ $1 == "--" ]]; then
dirs -v
return 0
fi
the_new_dir=$1
[[ -z $1 ]] && the_new_dir=$HOME
if [[ ${the_new_dir:0:1} == '-' ]]; then
#
# Extract dir N from dirs
index=${the_new_dir:1}
[[ -z $index ]] && index=1
adir=$(dirs +$index)
[[ -z $adir ]] && return 1
the_new_dir=$adir
fi
#
# '~' has to be substituted by ${HOME}
[[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"
#
# Now change to the new dir and add to the top of the stack
pushd "${the_new_dir}" > /dev/null
[[ $? -ne 0 ]] && return 1
the_new_dir=$(pwd)
#
# Trim down everything beyond 11th entry
popd -n +11 2>/dev/null 1>/dev/null
#
# Remove any other occurence of this dir, skipping the top of the stack
for ((cnt=1; cnt <= 10; cnt++)); do
x2=$(dirs +${cnt} 2>/dev/null)
[[ $? -ne 0 ]] && return 0
[[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
if [[ "${x2}" == "${the_new_dir}" ]]; then
popd -n +$cnt 2>/dev/null 1>/dev/null
cnt=cnt-1
fi
done
return 0
}
alias cd=cd_func
if [[ $BASH_VERSION > "2.05a" ]]; then
# ctrl+w shows the menu
bind -x "\"\C-w\":cd_func -- ;"
fi
При загрузке большого файла я довольно часто делаю:
while ls -la <filename>; do sleep 5; done
И затем просто ctrl+c, когда я сделан (или если ls
ненулевые возвраты). Это подобно watch
программа, но это использует оболочку вместо этого, таким образом, это работает над платформами без watch
.
Другой полезный инструмент является netcat, или nc
. Если Вы делаете:
nc -l -p 9100 > printjob.prn
Тогда можно настроить принтер на другом компьютере, но вместо этого использовать IP-адрес компьютера, работающего netcat. Когда задание печати отправляется, оно получено компьютером, работающим netcat, и выведено в printjob.prn
.
Мне нравится создавать команды с эхо и передавать их по каналу к оболочке:
$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s
, Почему? Поскольку это позволяет мне смотреть на то, что будет сделанным, прежде чем я сделаю это. Тот путь, если у меня есть ужасная ошибка (как удаление моего корневого каталога), я могу поймать его, прежде чем это произойдет. Очевидно, это является самым важным для разрушительных или безвозвратных действий.
type -a PROG
для нахождения всех мест, где ПРОГР доступна, обычно где-нибудь в ~ / мусорное ведро, а не то в/usr/bin/PROG, который, возможно, ожидался.
Можно использовать команду часов в сочетании с другой командой для поиска изменений. Пример этого был, когда я тестировал свой маршрутизатор, и я хотел заниматься числами на материале как отношение сигнал-шум, и т.д.
watch --interval=10 lynx -dump http://dslrouter/stats.html
У меня есть секретное оружие: оболочка-fu.
существует тысяча умных подсказок, прохладных приемов и эффективных рецептов, которые большую часть времени соответствуют на одной строке.
Тот, который я люблю (но я обманываю немного, так как я использую то, что Python установлен в большей части системы Unix теперь):
alias webshare='python -m SimpleHTTPServer'
Теперь каждый раз Вы вводите "webshare", текущий каталог будет доступен через порт 8000. Действительно хороший, когда Вы хотите совместно использовать файлы с друзьями в локальной сети без флеш-карты или удаленного dir. Потоковое видео и музыка будут работать также.
И конечно классическая fork-бомба, которая абсолютно бесполезна, но все еще большая забава:
$ :(){ :|:& };:
не пробуют это в рабочем сервере...
Я использую следующий много:
:p
модификатор для печати результата истории. Например,
!!:p
распечатает последнюю команду, таким образом, можно проверить, что это корректно прежде, чем выполнить его снова. Просто войдите !!
для выполнения его.
В том же духе:
!?foo?:p
будет искать Вашу историю новую команду, которая содержала строку 'нечто', и распечатайте его.
, Если Вы не должны печатать,
!?foo
, делает поиск и немедленно выполняет его.
Вот несколько тонких настроек конфигурации:
~/.inputrc
:
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
Это работает то же ^R
, но использование клавиш со стрелками вместо этого. Это означает, что я могу ввести (например). cd /media/
тогда стрелка вниз хита для движения в последнюю вещь I cd
'd к внутренней части /media/
папка.
(я использую Терминал Gnome, Вы, возможно, должны изменить коды Escape для других эмуляторов терминала.)
завершение Bash также невероятно полезно, но это - намного более тонкое дополнение. В ~/.bashrc
:
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
Это включит заполнение клавишей Tab на программу (например, попытка заполнения клавишей Tab, когда командная строка запустится с evince
, только покажет файлы, которые проявляют, может открыться, и это будет также полные вкладкой параметры командной строки).
Работы приятно с этим также в [1 110]:
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
^R инвертируют поиск. Хит ^R, введите фрагмент предыдущей команды, Вы хотите соответствовать, и поразить ^R, пока Вы не находите тот, который Вы хотите. Тогда я не должен помнить недавно используемые команды, которые находятся все еще в моей истории. Не исключительно колотят, но также и: ^E для конца строки, ^A для начала строки, ^U и ^K для удаления прежде и после курсора, соответственно.
Больше новинки, но это умно...
Лучшие 10 команд использовали:
$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head
Демонстрационный вывод:
242 git
83 rake
43 cd
33 ss
24 ls
15 rsg
11 cap
10 dig
9 ping
3 vi
Моя любимая команда "ls - Тор",
Она вызывает питание богов для списка последний раз измененных файлов в удобно читаемом формате.
Несомненно, Вы можете" diff file1.txt file2.txt
", но поддержки Bash замена процесса , который позволяет Вам diff
вывод команд.
, Например, скажем, я хочу удостовериться, что мой сценарий дает мне вывод, который я ожидаю. Я могу просто обернуть свой сценарий в < () и канал это к diff
для получения быстрого и грязного модульного теста:
$ cat myscript.sh
#!/bin/sh
echo -e "one\nthree"
$
$ ./myscript.sh
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$
Как другой пример, скажем, я хочу проверить, имеют ли два сервера тот же список установленного RPMs. Вместо sshing к каждому серверу, написав каждый список RPMs для разделения файлов, и делая diff
на тех файлах я могу просто сделать diff
от моей рабочей станции:
$ diff <(ssh server1 'rpm -qa | sort') <(ssh server2 'rpm -qa | sort')
241c240
< kernel-2.6.18-92.1.6.el5
---
> kernel-2.6.18-92.el5
317d315
< libsmi-0.4.5-2.el5
727,728d724
< wireshark-0.99.7-1.el5
< wireshark-gnome-0.99.7-1.el5
$
существует больше примеров в Усовершенствованном Руководстве по созданию сценариев Bash в http://tldp.org/LDP/abs/html/process-sub.html .
ESC .
Вставляет последние аргументы от Вашей последней команды удара. Это пригождается больше, чем Вы думаете.
cp file /to/some/long/path
CD ESC .
Как перечислить [только 111] подкаталоги в текущем?
ls -d */
Это - простой прием, но Вы не знали бы, сколько времени я должен был найти что один!
Я - поклонник !$
, !^
и !*
expandos, возврат, из новой отправленной командной строки: последний объект, сначала не управляйте объектом и всеми объектами некоманды. К остроумию (Отмечают, что оболочка распечатывает команду сначала):
$ echo foo bar baz
foo bar baz
$ echo bang-dollar: !$ bang-hat: !^ bang-star: !*
echo bang-dollar: baz bang-hat: foo bang-star: foo bar baz
bang-dollar: baz bang-hat: foo bang-star: foo bar baz
Это пригождается, когда Вы, говорят ls filea fileb
, и хотят отредактировать один из них: vi !$
или они оба: vimdiff !*
. Это может также быть обобщено к "n
th аргумент" как так:
$ echo foo bar baz
$ echo !:2
echo bar
bar
Наконец, с путями, можно достигнуть части пути путем добавления :h
и :t
к любому вышеупомянутому expandos:
$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id
переименуйте
Пример:
$ ls
this_has_text_to_find_1.txt
this_has_text_to_find_2.txt
this_has_text_to_find_3.txt
this_has_text_to_find_4.txt
$ rename 's/text_to_find/been_renamed/' *.txt
$ ls
this_has_been_renamed_1.txt
this_has_been_renamed_2.txt
this_has_been_renamed_3.txt
this_has_been_renamed_4.txt
Так полезный
Моим фаворитом является '^string^string2', который принимает последнее управление, заменяет строку string2 и выполняет его
$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz
У меня часто есть псевдонимы для vi, ls, и т.д. но иногда Вы хотите выйти из псевдонима. Просто добавьте наклонную черту влево к команде впереди:
, Например:
$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM
Прохладный, не так ли?
Используя 'набор-o vi' из командной строки, или лучше, в .bashrc, помещает Вас в vi режим редактирования на командной строке. Вы запускаете в режиме 'вставки', таким образом, можно ввести и возвратиться как нормальные, но если Вы делаете 'большую' ошибку, можно поразить клавишу Esc и затем использовать 'b' и 'f' для перемещений, как Вы делаете в vi. по часовой стрелке для изменения слова. Особенно полезный после перевода в рабочее состояние команды истории, которую Вы хотите изменить.
Подобный многим выше, моим текущим фаворитом является нажатие клавиши [высокий звук]. (Высокий звук и"." ключи вместе), это совпадает с $! (Вставляет последний аргумент от предыдущей команды) за исключением того, что это непосредственно и для меня легче ввести. (Просто не может использоваться в сценариях)
, например:
mkdir -p /tmp/test/blah/oops/something
cd [alt].
Другой фаворит:
!!
Повторения Ваша последняя команда. Самый полезный в форме:
sudo !!
Представьте несколько команд в виде строки вместе с помощью & & команда:
./run.sh && tail -f log.txt
или
kill -9 1111 && ./start.sh
cd -
Это - командная строка, эквивалентная из кнопки "Назад" (берет Вас к предыдущему каталогу, Вы были в).
pbcopy
Копирует в системный буфер обмена Mac. Вы можете передать ему команды по конвейеру ... попробуйте:
pwd | pbcopy
du-a | вид-n | хвост-99
, чтобы найти, что большие файлы (или каталоги файлов) очищают к свободному дисковое пространство.