遇到shell重定向的一個奇怪問題:'消失'的標準輸入!

来源:http://www.cnblogs.com/annsshadow/archive/2016/01/22/5151707.html
-Advertisement-
Play Games

需求:把找到的文件逐行輸出,然後用rm在許可的情況下刪除前置準備:$lsrm.sh test1 test2 test3 test4 test5 test6$cat rm.sh#! /bin/bashwhile read fileinfodo rm -iv $fileinfodone< <( ...


需求: 把找到的文件逐行輸出,然後用rm在許可的情況下刪除   前置準備: 
$ls
rm.sh test1 test2 test3 test4 test5 test6
$cat rm.sh
#! /bin/bash
while read fileinfo
do 
    rm -iv $fileinfo
done< <( find . -name 'test*' -print )

第一次執行結果:

$bash rm.sh

rm:是否刪除普通文件“./test2”?

出現的問題:

雖然rm顯示了詢問信息,卻並不關心我輸入的是什麼(就沒給我機會),也沒有刪除文件

第一次結果分析: rm -iv需要從標準輸入中獲取允許,但標準輸入已經被重定向為’done< <( find $path -type f -print )‘,所以rm只能從這獲取輸入了,也造成了這一次執行的令就無效了,然後read和rm就不斷地逐次消耗掉輸入的行,也就什麼都沒做了;    第二次前置準備
$ls
rm2.sh test1 test2
$cat test1
test1
test2
test3
test4
test5
test6
 程式解釋: 當每次read到的內容不為空就輸出到屏幕,count統計的是嘗試的刪除次數
$cat rm2.sh
#! /bin/bash
count=0
while read info
do
    if [ ! -z info ]
        then echo $info:not null
    fi
    rm -iv test2
    let count++
    echo $count
done< test1

第二次執行結果:

 

$bash rm2.sh
test1:not_null
rm:是否刪除普通文件 “test2”?1
test3:not_null
rm:是否刪除普通文件 “test2”?2
test5:not_null
rm:是否刪除普通文件 “test2”?3
驗證分析: 符合第一次結果分析的猜測; 解決方案: 將原標準輸入(鍵盤輸入)存放在新的文件描述符中,併在rm中將新的文件描述符作為它的輸入 修正後的程式:
$cat rm3.sh
#! /bin/bash
exec 3<&0
while read fileinfo
do 
    rm -iv $fileinfo <&3
done< <( find . -type f -print )
    順帶一提: 'done< <( find . -type f -print )'有兩個‘<’的原因: 第一步:‘<( find . -type f -print )’相當於將子shell中的結果輸出到一個臨時文件 第二步:‘done< temp_file’從臨時文件中獲取輸入
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言今天在在清理資料庫,是MS SQL Server,其中用到分離資料庫文件。在這過程中,出現了一個小小的問題:誤將資料庫日誌文件刪除了,然後數據就打不開了,除了離線,其他操作都報錯。資料庫分離常規方法此方法是常規慣用的方式,多步驟。如圖所示:粗暴方法此方法簡單粗暴,非常實用,一條SQL語句就搞定了...
  • 一直想在 Linux 上使用 MONO 試試運行 Rafy,最近因為業務需要,總算是真正地試驗了一次。下麵是本次部署記錄的一些要點。 Linux 這次部署,我是和兩位同事一起來試驗的。由於我們對 Linux 都不太熟悉(多年前曾經用過很少一段時間的 RedHat,那些命令現在也早已忘記了,哈。),所...
  • 本文由ilanniweb提供友情贊助,首發於爛泥行天下想要獲得更多的文章,可以關註我的微信ilanniweb公司的業務是使用tomcat做web容器,為了更有效的利用伺服器的性能,我們一般部署多個tomcat做業務的負載均衡。一、業務需求目前一臺伺服器上,部署了4個tomcat,也就相當於4個節點。...
  • 上一篇,運用 Linux 的 sysfs,控制本機上的 LED 燈,usr0 至 usr3,這次用 GPIO 控制外部的電路,點亮 LED 燈。 這次的全部材料: BBB 一臺 購買 BBB 自帶的 USB 數據線 麵包板一塊 470Ω 三枚(至少一枚) 白、紅、黃、綠 LED 燈各一個(至少一個)...
  • 一.概述 barrier(屏障)與互斥量,讀寫鎖,自旋鎖不同,它不是用來保護臨界區的。相反,它跟條件變數一樣,是用來協同多線程一起工作!!!條件變數是多線程間傳遞狀態的改變來達到協同工作的效果。屏障是多線程各自做自己的工作,如果某一線程完成了工作,就等...
  • linux回收站機制
  • 這個問題困擾了我,可能有兩個原因。1、文件夾許可權不夠,至少也要給出 USERS 組的可讀可寫許可權;2、文件夾的磁碟滿了,文件寫不進去了;如果是這個不能創建和寫的問題,很大的概率就是文件的許可權。沒有網上一大堆的解釋。改變方法:1 #chown-Rmysql:mysql/usr/local/mysql/...
  • 本文轉自調整虛擬記憶體,支持原創、尊重原創,分享知識!個人發現有些翻譯不當的地方,稍微做了下修改、調整。如果英文足夠NB,建議閱讀英文。 虛擬記憶體通常被進程、文件系統緩存以及內核消耗。虛擬記憶體的使用由很多因素決定,受以下參數影響: swappiness 參數值可為 0-100,控制系統 swap 的使...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...