В чем разница между heredoc и подстановкой процесса?

Использование мощного подхода 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
}
-1
01.03.2020, 13:46
4 ответа

Это подчеркивает разницу. wc видит одни и те же данные в обоих случаях. Во-первых,он получает аргумент (временное имя файла )в командной строке. Во втором случае имя файла поглощается перенаправлением оболочки, wc не получает аргументов и по умолчанию читает стандартный ввод.

Paul--) wc <( echo one two three )
      1       3      14 /dev/fd/63
Paul--) wc < <( echo one two three )
      1       3      14
Paul--) 
2
28.04.2021, 23:21

Я прочитал несколько хороших ответов, и они не так просты, как то, что я собирался написать, так что вот:

  • Здесь док <<, подключается к стандарту в.
  • Процесс подстановки <(...), подключается к "файлу", а затем подставляет в файле -имя.

Примечание. :Когда мы говорим файл, мы используем его в стиле Unix. Не обязательно файл на диске. Это может быть каталог с именем -pipe, анонимный -канал, сетевой сокет -, сокет unix -,... В этом случае это будет (де -анонимный :. ] имеет имя файла -, видимое только для процессов, которые подключены к )анонимному -каналу.

0
28.04.2021, 23:21

Документ здесь -является перенаправлением. Оболочка где-то сохраняет текст, а затем перенаправляет его куда-то на ввод команды. (Возможно, это не точный механизм, но его достаточно, чтобы подумать о системе.)

Замена процесса обеспечивает путь, который подключается к вводу или выводу команды внутри замены процесса. Однако сам по себе он не применяет никакого перенаправления ни к чему, кроме этой команды. Если символы перенаправления(>в >(...)или <в<(...))заставляют вас думать иначе, просто подумайте, что они применяются ко всему, что находится внутри ->, указывающим на процесс, подстановка применяется к входу . ] внутри команды, указание <аналогично относится к выводу. Они не влияют на то, что находится снаружи .

Так, в:

nc 192.168.1.186 9760 <<END
command1
command2
END
Ввод

ncперенаправляется, но в

nc -lvkp 8000 <(echo "test")
Ввод

ncперенаправляется , а не . Однако вывод(echoнаправляется тому, что будет считываться из подстановки процесса.)ncпросто получает дополнительный аргумент.

Вам нужно применить это перенаправление самостоятельно:

nc -lvkp 8000 < <(echo "test")
2
28.04.2021, 23:21

Здесь -документ представляет собой стандартное перенаправление , в то время как подстановки процессов не являются стандартными (и, следовательно, не все оболочки поддерживают их )и не являются перенаправлениями.

Подстановка процесса явно выполняет команду для создания вывода, который затем может быть прочитан из определенного имени пути, в то время как здесь -документ создает текстовый файл , который немедленно перенаправляется. Здесь -документ может быть реализован путем записи во временный файл, но он также может быть реализован путем записи в именованный канал или другим подобным способом.

Обратите внимание, что ваш вызов ncпередает результат подстановки процесса не в стандартный поток ввода nc, а в виде имени файла в командной строке.Чтобы передать вывод echoна стандартный ввод с помощью подстановки процесса, используйте

nc -lvkp 8000 < <( echo "test" )

Обратите внимание, как первый <выполняет перенаправление с имени пути, к которому приводит подстановка процесса.

Имея здесь -документ, вы бы написали

nc -lvkp 8000 <<'END'
test
END

Обратите внимание, как перенаправление выполняется документом здесь -без ссылки на конкретный путь. Также обратите внимание, что мы не используем команду echoдля создания текста документа, который мы перенаправляем.

2
28.04.2021, 23:21

Теги

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