kdavh
kdavh

Reputation: 414

Shell sourced file output piped vs redirected has different effects.

I'm struggling to understand the difference between | and > operators

I've looked in places like:

https://www.gnu.org/software/bash/manual/html_node/Redirections.html and

Pipe vs redirect into process

But can't make enough sense of the explanations.


Here is my practical example:

test-a.sh:

alias testa='echo "alias testa here"'

echo "testa echo"
echo "testa echo2"

test-b.sh:

alias testb='echo "alias testb here"'

echo "testa echo"
echo "testa echo2"

test-pipes.sh:

function indent() {
  input=$(cat)

  echo "$input" | perl -p -e 's/(.*)/  \1/'
}

source test-a.sh | indent
testa

source test-b.sh > >(indent)
testb

output:

$ source test-pipes.sh
  testa echo
  testa echo2
test-pipes.sh:10: command not found: testa
  testa echo
  testa echo2
alias testb here

Piping doesn't allow the alias to be set in the current process, but the redirection does.

Can someone give a simple explanation?

Upvotes: 1

Views: 39

Answers (1)

John Kugelman
John Kugelman

Reputation: 361555

From the bash man page:

Each command in a pipeline is executed as a separate process (i.e., in a sub‐shell).

Many things child processes do are isolated from the parent. Among the list are: changing the current directory, setting shell variables, setting environment variables, and aliases.

$ alias foo='echo bar' | :
$ foo
foo: command not found

$ foo=bar | :; echo $foo

$ export foo=bar | :; echo $foo

$ cd / | :; $ pwd
/home/jkugelman

Notice how none of the changes took effect. You can see the same thing with explicit subshells:

$ (alias foo='echo bar')
$ foo
foo: command not found
$ (foo=bar); echo $foo

$ (export foo=bar); echo $foo

$ (cd /); pwd
/home/jkugelman

Redirections, on the other hand, do not create subshells. They merely change where the input and output of a command go. The same goes with function calls. Functions are executed in the current shell, no subshell, so they're able to create aliases.

Upvotes: 1

Related Questions