自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux 中的 subshell 是什么?

系統(tǒng) Linux
我們都知道 shell 是一個可以讓你在 Linux 中運行命令的程序,你與 shell 的主要交互就是在終端中運行命令的時候。

除了 shell 之外,還有一個 subshell 的概念。

什么是 subshell

subshell 基本上就是一個新的 shell,只用于運行所需的程序。subshell 可以訪問 “父 shell” 設置的全局變量,但是不能訪問局部變量;subshell 對全局變量所作的任何更改都只限于當前 subshell 會話內(nèi),不會傳遞到 “父 shell”中。

接下來我們根據(jù)幾個實際例子來詳細介紹一下。首先看下面腳本,一個顯示變量 var 的單行代碼:

echo $var

我將這個變量的值設置為 字符串"LHB",那么大家猜一下,運行結果會怎樣?

圖片

奇怪吧,腳本并沒有打印我設置的變量值。

Shell 腳本在子Shell中運行(默認情況下)

為什么會出現(xiàn)上面的情況呢?因為當你在運行 shell 腳本時,它會在自己的 shell 中運行。由于此 shell 源自于另一個 shell(設置變量和運行腳本的地方),因此稱為子 shell(即 subshell)。

shell 腳本無法讀取變量的值,因為它是一個局部變量,并且新創(chuàng)建的 shell 不知道這個值。如果你希望 subshell 可以訪問這個變量,那么需要使用 export 命令將其轉(zhuǎn)為全局變量。

圖片

你可以在當前 shell 中新啟動一個 shell 來創(chuàng)建 subshell,只需運行 bash,即可進入一個 subshell。在 subshell 中運行 exit 命令即可退出 subshell 并回到原 shell 中。

圖片

但是新創(chuàng)建的 subshell 并不會打開一個新的窗口,它還是在當前窗口中,不過已經(jīng)是一個新的 shell 了。

上面例子中我使用了一個變量來展示兩個 shell(父 shell 和子 shell)的區(qū)別。當變量 var 沒有導出時(使用 export),子 shell 是不能讀取到的。

嵌套 subshell

你可以以相同的方式創(chuàng)建嵌套 subshell。變量導出后(export),它在隨后創(chuàng)建的所有 subshell 中都可用。

你可以在 subshell 中修改導出后的變量的值,更改后的值也會傳遞給后續(xù) subshell 中(因為變量本身是全局變量),但是當你退出 subshell 而回到原先的 shell 后,變量還是最初的原始值。

圖片

為什么呢?因為到處變量的值被復制到 subshell,它是一個副本(從 LHB 變?yōu)?HOC),在父 shell 中還是保留著原始值。

所以,需要記住的是:無法在 subshell 中更改父 shell 中的變量。無論該變量是否導出,在 subshell 中對變量做的修改不會影響到父 shell。

圖片

在當前 shell 中執(zhí)行 shell 腳本

默認情況下,一個 shell 腳本是在自己的 shell(即 subshell)中執(zhí)行的。但是你可以修改這個默認情況,即將 shell 腳本在當前 shell 中執(zhí)行,通過 shell 內(nèi)置命令 . 來實現(xiàn)。

具體怎樣實現(xiàn)呢?不是這樣 ./script,而是如下這種方式:

. script

這樣,腳本中的命令就會在當前 shell 中執(zhí)行,就像這些命令被直接鍵入終端中一樣,而不是在 subshell 中運行。腳本可以通過這種方式來訪問局部變量。

圖片


責任編輯:龐桂玉 來源: TIAP
相關推薦

2023-03-01 09:49:23

2022-04-03 13:17:21

Linux黑話解釋GRUB

2023-11-22 10:51:25

LinuxSuper

2022-11-16 08:43:56

Linux/etc/hosts文件

2023-05-18 22:51:08

2022-09-15 09:54:34

nullPython字符

2021-04-26 07:51:00

JavaScript方法函數(shù)

2010-06-29 13:58:17

SNMPMIB

2022-11-14 15:07:09

Linux管道

2023-05-05 08:18:38

Linuxsource命令

2023-03-28 07:03:15

gRPCMetadata

2022-06-29 08:37:03

事件循環(huán)JS 語言

2021-12-03 18:29:31

GoAny 泛型

2019-05-20 10:58:40

物聯(lián)網(wǎng)IOT技術

2022-05-17 07:36:38

CSSBFC前端

2022-07-28 08:34:59

事件委托JS

2010-06-21 15:49:59

Linux apt是什

2021-12-20 14:56:07

LinuxTTY

2021-06-11 10:33:14

MySQLPidSocket

2023-10-11 08:29:54

volatileJava原子性
點贊
收藏

51CTO技術棧公眾號