Использование мощного подхода zsh в bash:
Первый простой способ расширения bash:
~/.runscripts
#load all scripts inside $1 dir
run_scripts()
{
for script in $1/*; do
# skip non-executable snippets
[ -f "$script" ] && [ -x "$script" ] || continue
# execute $script in the context of the current shell
. $script
done
}
Включить в.bashrc:
. ~/.run_scripts
run_scripts ~/.bashrc.d
Вы можете создать ~/.bashrc.d/cdhook с помощью:
#!/bin/bash
chpwd() {
: #no action
}
cd() {
builtin cd $1
chpwd $1
}
Теперь вам нужно заменить функцию:
#list files after cd
chpwd() {
ls -lah --color
}
Это подчеркивает разницу. wc видит одни и те же данные в обоих случаях. Во-первых,он получает аргумент (временное имя файла )в командной строке. Во втором случае имя файла поглощается перенаправлением оболочки, wc не получает аргументов и по умолчанию читает стандартный ввод.
Paul--) wc <( echo one two three )
1 3 14 /dev/fd/63
Paul--) wc < <( echo one two three )
1 3 14
Paul--)
Я прочитал несколько хороших ответов, и они не так просты, как то, что я собирался написать, так что вот:
<<
, подключается к стандарту в. <(...)
, подключается к "файлу", а затем подставляет в файле -имя. Примечание. :Когда мы говорим файл, мы используем его в стиле Unix. Не обязательно файл на диске. Это может быть каталог с именем -pipe, анонимный -канал, сетевой сокет -, сокет unix -,... В этом случае это будет (де -анонимный :. ] имеет имя файла -, видимое только для процессов, которые подключены к )анонимному -каналу.
Документ здесь -является перенаправлением. Оболочка где-то сохраняет текст, а затем перенаправляет его куда-то на ввод команды. (Возможно, это не точный механизм, но его достаточно, чтобы подумать о системе.)
Замена процесса обеспечивает путь, который подключается к вводу или выводу команды внутри замены процесса. Однако сам по себе он не применяет никакого перенаправления ни к чему, кроме этой команды. Если символы перенаправления(>
в >(...)
или <
в<(...)
)заставляют вас думать иначе, просто подумайте, что они применяются ко всему, что находится внутри ->
, указывающим на процесс, подстановка применяется к входу . ] внутри команды, указание <
аналогично относится к выводу. Они не влияют на то, что находится снаружи .
Так, в:
nc 192.168.1.186 9760 <<END
command1
command2
END
Вводnc
перенаправляется, но в
nc -lvkp 8000 <(echo "test")
Вводnc
перенаправляется , а не . Однако вывод(echo
направляется тому, что будет считываться из подстановки процесса.)nc
просто получает дополнительный аргумент.
Вам нужно применить это перенаправление самостоятельно:
nc -lvkp 8000 < <(echo "test")
Здесь -документ представляет собой стандартное перенаправление , в то время как подстановки процессов не являются стандартными (и, следовательно, не все оболочки поддерживают их )и не являются перенаправлениями.
Подстановка процесса явно выполняет команду для создания вывода, который затем может быть прочитан из определенного имени пути, в то время как здесь -документ создает текстовый файл , который немедленно перенаправляется. Здесь -документ может быть реализован путем записи во временный файл, но он также может быть реализован путем записи в именованный канал или другим подобным способом.
Обратите внимание, что ваш вызов nc
передает результат подстановки процесса не в стандартный поток ввода nc
, а в виде имени файла в командной строке.Чтобы передать вывод echo
на стандартный ввод с помощью подстановки процесса, используйте
nc -lvkp 8000 < <( echo "test" )
Обратите внимание, как первый <
выполняет перенаправление с имени пути, к которому приводит подстановка процесса.
Имея здесь -документ, вы бы написали
nc -lvkp 8000 <<'END'
test
END
Обратите внимание, как перенаправление выполняется документом здесь -без ссылки на конкретный путь. Также обратите внимание, что мы не используем команду echo
для создания текста документа, который мы перенаправляем.