首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shell源文件输出管道与重定向有不同的效果。

Shell源文件输出管道与重定向有不同的效果。
EN

Stack Overflow用户
提问于 2018-01-11 23:18:52
回答 1查看 31关注 0票数 1

我很难理解|>运算符之间的区别

我看过的地方有:

node/Redirections.html

管道vs重定向进入过程

但对这些解释没有足够的意义。

以下是我的实际例子:

测试-a.sh:

代码语言:javascript
复制
alias testa='echo "alias testa here"'

echo "testa echo"
echo "testa echo2"

测试-b.sh:

代码语言:javascript
复制
alias testb='echo "alias testb here"'

echo "testa echo"
echo "testa echo2"

test-pipes.sh:

代码语言:javascript
复制
function indent() {
  input=$(cat)

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

source test-a.sh | indent
testa

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

产出:

代码语言:javascript
复制
$ source test-pipes.sh
  testa echo
  testa echo2
test-pipes.sh:10: command not found: testa
  testa echo
  testa echo2
alias testb here

管道不允许在当前进程中设置别名,但重定向允许设置别名。

有人能给出一个简单的解释吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-11 23:37:30

来自bash手册页

管道中的每个命令都作为单独的进程执行(即在子shell中)。

子进程所做的许多事情都是与父进程隔离的。这些列表包括:更改当前目录、设置shell变量、设置环境变量和别名

代码语言:javascript
复制
$ alias foo='echo bar' | :
$ foo
foo: command not found

$ foo=bar | :; echo $foo

$ export foo=bar | :; echo $foo

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

注意这些更改是如何没有生效的。使用显式子see可以看到同样的情况:

代码语言:javascript
复制
$ (alias foo='echo bar')
$ foo
foo: command not found
$ (foo=bar); echo $foo

$ (export foo=bar); echo $foo

$ (cd /); pwd
/home/jkugelman

另一方面,重定向不创建子subshells。它们只是改变命令的输入和输出的位置。函数调用也是如此。函数在当前shell中执行,没有子shell,因此它们能够创建别名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48217355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档