Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 什么是;回音a&;!d";你到底是一步一步做的吗?_Bash_Echo_Alias - Fatal编程技术网

Bash 什么是;回音a&;!d";你到底是一步一步做的吗?

Bash 什么是;回音a&;!d";你到底是一步一步做的吗?,bash,echo,alias,Bash,Echo,Alias,我尝试了以下方法,得到了: $ echo a&!d echo a&disown [1] 16089 a $ echo a & disown [1] 16101 a 然后我尝试了以下方法,得到了: $ echo a&!d echo a&disown [1] 16089 a $ echo a & disown [1] 16101 a 有人能一步一步地解释一下在这两种情况下到底发生了什么吗?什么是!d它到底像别名还是什么?谁,在什么条件下

我尝试了以下方法,得到了:

$ echo a&!d
echo a&disown 
[1] 16089
a
$ echo a & disown 
[1] 16101
a
然后我尝试了以下方法,得到了:

$ echo a&!d
echo a&disown 
[1] 16089
a
$ echo a & disown 
[1] 16101
a

有人能一步一步地解释一下在这两种情况下到底发生了什么吗?什么是
!d
它到底像别名还是什么?谁,在什么条件下展开它?

该行由两个命令组成:

echo a &

第一个运行
echoa
&
使其在后台执行,即在子shell中异步执行

第二个是历史替换,它运行以
d
开头的最后一个命令。在您的情况下,这似乎是
否认
,但它可能是任何东西

disown
从活动作业表中删除当前作业;在本例中,“当前作业”是指上次在后台启动的作业


使用历史替换时,shell在实际运行命令之前打印扩展;这就是为什么你会看到这条线

echo a&disown
随着你命令的扩展

下一行,

[1] 16089
是因为进程已在后台启动:
[1]
是作业编号,
16089
是进程ID。带有
a
的行仅是
echo a
命令的输出

第二次运行命令时,如果不进行历史扩展,则

[1] 16101
直接的,因为没有历史的扩展来显示;作业编号再次为
1
,进程ID已更改为
16101

总结:

  • echo a&!d

    echo a&disown   # History expansion
    [1] 16089       # Job number and process ID
    a               # Output from echo command
    
  • echo a&disown

    [1] 16101       # Job number and process ID
    a               # Output from echo command
    
  • 参考资料


    该行由两个命令组成:

    echo a &
    

    第一个运行
    echoa
    &
    使其在后台执行,即在子shell中异步执行

    第二个是历史替换,它运行以
    d
    开头的最后一个命令。在您的情况下,这似乎是
    否认
    ,但它可能是任何东西

    disown
    从活动作业表中删除当前作业;在本例中,“当前作业”是指上次在后台启动的作业


    使用历史替换时,shell在实际运行命令之前打印扩展;这就是为什么你会看到这条线

    echo a&disown
    
    随着你命令的扩展

    下一行,

    [1] 16089
    
    是因为进程已在后台启动:
    [1]
    是作业编号,
    16089
    是进程ID。带有
    a
    的行仅是
    echo a
    命令的输出

    第二次运行命令时,如果不进行历史扩展,则

    [1] 16101
    
    直接的,因为没有历史的扩展来显示;作业编号再次为
    1
    ,进程ID已更改为
    16101

    总结:

  • echo a&!d

    echo a&disown   # History expansion
    [1] 16089       # Job number and process ID
    a               # Output from echo command
    
  • echo a&disown

    [1] 16101       # Job number and process ID
    a               # Output from echo command
    
  • 参考资料


    感谢您的精彩回答。但是我的问题实际上是关于为什么
    echoa&disown
    会被镜像,为什么会有镜像,为什么不
    echoa&!d
    以及为什么在上面
    [1]16101
    @yukashimahuksay你的意思是为什么在第一种情况下打印命令?我承认我的问题发布得非常不当。我也不知道历史。非常感谢!我是指我发布的两个命令的输出之间的差异。究竟是什么原因。到底是什么事件导致了这种差异呢?Yukashimahuk说,壳牌的历史扩张可能是出乎意料的,而且相当混乱。如果您不想发生这种奇怪的事情,可以使用
    set+H
    将其关闭。谢谢您的回答。但是我的问题实际上是关于为什么
    echoa&disown
    会被镜像,为什么会有镜像,为什么不
    echoa&!d
    以及为什么在上面
    [1]16101
    @yukashimahuksay你的意思是为什么在第一种情况下打印命令?我承认我的问题发布得非常不当。我也不知道历史。非常感谢!我是指我发布的两个命令的输出之间的差异。究竟是什么原因。到底是什么事件导致了这种差异呢?Yukashimahuk说,壳牌的历史扩张可能是出乎意料的,而且相当混乱。如果您不想发生这种奇怪的事情,可以使用
    set+H
    将其关闭。