1. 程式人生 > >Shell中BASH與KSH使用管道時的差別

Shell中BASH與KSH使用管道時的差別

大笑注:此文涉及實際專案原始碼截圖,檢視時可不關注處理邏輯! 大笑   

     根據測試與實際的使用過程中發現:BASH中管道內都為子程序,而KSH中最後一個管道為父程序其他為子程序!(簡單的測試過程放在最後)。

因此KSH與BASH轉換時,在使用管道的地方,有以下幾種情況時,需要注意:
(一)    管道+read的方式:主程序讀取不了值

例如:


建議修改:
1.    這裡可以讀取多個值(推薦這種方式修改):
 
2.    這裡只可以讀取一個值:

 

(二)    管道+while read:需要讀取while read中的值;讀取不了管道中的值
例如:

 

建議修改:
1.    通過”()”強制將輸出資料語句與管道最後一個保持在一個程序內
 

2.    通過<<<這個進行處理
修改為:
While read test1 test2
Do
Done<<<”`cat *.txt`”
(三)    Cat 檔案+while read:需要讀取while read中的值;讀取不了管道中的值
例如:
Cat file.txt|while read
Do
檔案操作
Done
取檔案操作中的值(可能為檔案計算總和)
建議方式:
while read
Do
檔案操作
Done< file.txt
取檔案操作中的值(可能為檔案計算總和)
#####這裡不使用管道就避免了這種情況!
(四)    管道+while:需要從while中退出指令碼;退出管道後,指令碼繼續執行
例如:

 

說明:這裡的exit 1是不會退出指令碼的,會輸出echo的內容,指令碼繼續執行;造成指令碼邏輯判斷失誤與資訊輸出不規範
建議修改:

a.    子程序輸出返回資訊,主程序判斷管道最後的退出狀態!(也可以管道返回狀態碼,主程序判斷)


總之,目前BASH中使用管道時,都要當做子程序對待;因此,特別是想退出指令碼或讀取管道中處理的值時,需要特別注意!
(五)    管道+while &+wait;不會等待;
例如:
echo |..|while read file
do
(
……
)
done
wait
這種寫法本身也是有點錯誤,因為我們的本意是等待while中的&,那麼wait就應該和它待在一起,而由於bash中的最後管道為子程序,因此,才造成了bash與ksh不同;
建議修改:
echo |..|(while read file
do
(
……
)
done
wait)
使用()將其強制放到一個程序中。
(六)    測試證明過程
 

這裡只是進行了簡單的測試進行證明,如需要詳細瞭解,可以通過觀察程序號等資訊,或者查詢官方手冊。我目前看到網上有這方面問題的指出,但都不太全面;因此把專案過程中遇到的問題在這裡總結一下。

相關推薦

ShellBASHKSH使用管道差別

注:此文涉及實際專案原始碼截圖,檢視時可不關注處理邏輯!          根據測試與實際的使用過程中發現:BASH中管道內都為子程序,而KSH中最後一個管道為父程序其他為子程序!(簡單的測試過程放在最後)。因此KSH與BASH轉換時,在使用管道的地方,有以下幾種情況時,需要

Shellbash的特性小結

重要 tro 通過 size bit more 內存 [] unix Shell: 用戶與操作系統之間完成交互式操作的一個接口程序,為用戶提供簡化了的操作;上世紀的70年代中期在貝爾實驗室,Bourne位Unix開發了一個shell程序Bourne Shell,簡稱s

shell$(( ))和$[]$( )還有${ }的區別

n) 變量替換 ask 進制 不足 都是 反引號 arr not $( )與` `(反引號)在bash shell中,$( )與` `(反引號)都是用來做命令替換(command substitution)用的。# echo `which who`# echo $(whic

shelluniqsort -u 兩種去重的對別

記錄 功能 fff cat 信息 執行 刪除重復 命令 容易 sort -u 和 uniq都能起到刪除重復信息的功能,那麽他們的區別究竟在哪呢?$ cat test jasonjasonjasonfffffjason 下面分別執行三個命令 1:so

Shellwwho列出Linux系統登入使用者

w命令 描述 用於顯示登入的使用者及他們當前執行的程序 例項 [[email protected] ~]# w 07:55:56 up 11 min, 3 us

shell指令碼函式的使用策略

指令碼:執行的副作用不影響父環境,開闢了fork子程序; 函式:副作用,定義的變數,資料預設直接新增到了呼叫者的環境,也是它自己的環境;不想副作用影響呼叫者環境,就必須主動用local修飾;   指令碼可以使用source退化為函式; 儘量使用指令碼,而不是函式,除非函式本身就是系統級別的作

VS2008原始檔模組生成的檔案不同,仍要讓偵錯程式使用它嗎

解決辦法: 1.在工具-> 選項-> 除錯-> 常規 裡 把“要求原始檔和版本匹配”的勾勾去掉 然後去掉“地址級的除錯”的勾勾(這樣就不會出現反彙編程式碼了) 然後重新引用 2.直接把WEB專案下面的Bin資料夾下的BLL全部刪除。 3.若出現如下的警告資訊 仔細看生成時輸出視窗有

linux shell邏輯,或表示式

與&& 1)if [ $str=a -a $str=b ]  2)if [ $str=a ] && [  $str=b ] 或||: 1)if [ $str=a -o

shellbashsh的區別

在我們所使用的系統當中,使用sh呼叫執行指令碼,相當於打開了bash的POSIX標準模式 (等效於bash的 --posix 引數) 一般的,sh是bash的“子集” (不是子集的部分,具體區別見下的“Things sh has that bash does not”

shell$(( ))、$( )${ }的區別

在bash中,$( )與` `(反引號)都是用來作命令替換的。 命令替換與變數替換差不多,都是用來重組命令列的,先完成引號裡的命令列,然後將其結果替換出來,再重組成新的命令列。 例子: $ echo today is $(date "+%Y-%m-%d

nginx配置檔案locationroot訪問的聯絡

在配置nginx時,由於之前沒有搞明白整個訪問資源時所走的路徑,總是會出現由於測試所寫的url與配置檔案中的不統一,導致返回404的狀態碼。對於nginx虛擬主機來訪問靜態資源: server{    

bash字串操作以及shell$(( ))$( )還有${ }的區別

介紹下Shell中的${}、##和%%使用範例,本文給出了不同情況下得到的結果。 假設定義了一個變數為: 程式碼如下: file=/dir1/dir2/dir3/my.file.txt 可以用${ }分別替換得到不同的值: ${file#*/}:刪掉第一個 / 及其左邊的字串:dir1/di

Linux學習之Shell基礎——Bash基本功能——多命令順序執行管道

1、多命令順序執行() 多命令執行符 格式 作用 ; 命令1  ; 命令2 多個命令順序執行,命令之間沒有任何邏輯聯絡 && 命令1 &am

shell基礎-bash基本功能-多命令順序執行管道

1. 多命令順序執行 多命令執行符 基本格式 作用 ; 命令1 ; 命令2 多個命令按照先後順序執行,命令之間沒有邏輯關係。 && 命令1 && 命令2 邏輯與。 只有當命令

shell規則表達式特殊符號

命令 分享 目錄 輸入 特殊符號 bcd cnblogs span tool 在 bash 的操作環境中還有一個非常有用的功能,那就是通配符 (wildcard) ! 我們利用 bash 處理數據就更方便了!底下我們列出一些常用的通配符喔: 符號 意義 * 代表『

Shell條件判斷語法判斷條件

expression 表達式 字符串 linux 影響 一,簡介Shell各種判斷結構和運算符的用法是shell編程的基礎,了解shell的判斷、運算符和一些退出狀態對後面的學習有很重要的影響。shell有一個內部命令test經常用於對判斷語句進行測試一種或幾種狀態的條件是否成立二. 判斷

Shell的>/dev/null 2>&1 2>&1 >/dev/null &>/dev/null 的區別

文件描述符 art 應該 tar 輸入 情況 style 鍵盤 blog 默認情況下,總是有三個文件處於打開狀態,標準輸入(鍵盤輸入)、標準輸出(輸出到屏幕)、標準錯誤(也是輸出到屏幕),它們分別對應的文件描述符是0,1,2 。那麽我們來看看下面的幾種重定向方法的區別: &

王立平--HttpGet() Post()的差別

san gin word-wrap word add spa line 都是 保密 Http協議是基於TCP協議的,而TCP協議是一種有連接。可靠的傳輸協議。假設丟失的話,會重傳。所以這種話,就 不會有數據的丟失了。 而Http協議有三種方法。Get,Pos

linux bash shellfor的用法and示例

bash shell腳本中for的用法關於linux bash shell中的for語句 在linux中shell是必不可少的一部分,但是在bash shell中有while,for,until等循環命令,今天就介紹一下關於for的一些用法。文中任何錯誤希望大佬們一一指出,不勝感激。bash sh

shell的變量eval(轉)

use web ech 讀取 eva bin 報錯 href 命令行 原文鏈接:http://www.361way.com/shell-eval-variable/4957.html shell 中經常會用到變量的嵌套的情況。比如,單個或多個變量的值作為變量名,再對該變量名