顯示具有 IO redirection 標籤的文章。 顯示所有文章
顯示具有 IO redirection 標籤的文章。 顯示所有文章

2022年7月11日 星期一

用GCC編譯包含autogen.sh的軟體

以前使用GCC編譯的原始碼通常會是tarball,也就是用x.tar.gz包起來的樣子。解開以後會在資料夾裡面找到configure這個編譯前設定的腳本,完成後會產生Makefile,之後再用make來將軟體編譯出來。隨著軟體越來越大,configure之後又出現了automake,若在原始碼資料夾裡面看到autogen.sh這個檔案就是這種狀況。編譯這種軟體,首要先安裝auto相關工具:

  • sudo apt-get install autoconf automake libtool

其次用下面指令產生configure需要的相關檔案:

  • ./autogen.sh

2021年12月31日 星期五

指令裡面的dash - 代表標準輸入

在指令裡面,dash (-, 通常是按鍵0右邊那個)代表的是標準輸入(standard input):

  1. cat ERR194147.fastq.gz | pv | time seqtk fqchk -q 30 - 
  2. zcat ERR194147.fastq.gz | pv | time seqtk fqchk -q 30 -
  3. unpigz -p 4 -c ERR194147.fastq.gz | pv | time seqtk fqchk -q 30 -

2019年11月18日 星期一

Shell一行文:移除空白行

要移除檔案裡面的空白行只要用sed指令:
  • sed '/^$/d' /tmp/data.txt
若沒有更動原本的檔案,可以用IO轉向
  • sed '/^$/d' /tmp/data.txt > /tmp/output.txt

2019年3月27日 星期三

用Process substitution做多重輸入

使用指令的時候,一般都只會有一個標準輸入,使用方式則是用符號小於<。若是此程式需要不只一個輸入,且不想要另外產生暫存檔案,這時候就可以使用process substitution來達成。例如說找30以下2和3的倍數,只要用下面的指令即可:
  • comm -12 <(seq 2 2 30 | sort) <(seq 3 3 30 | sort) | sort -n

使用上要注意<和( )之間不能夠有空格,指令的輸出其實就是下面三個指令的結果,但不只比較簡潔,而且中間並不需要暫存檔,也就不需要煩惱暫存檔要取什麼名字:

2019年2月13日 星期三

while read搭配pipe要注意變數值的傳遞

當Bash使用while read來讀檔案的時候,若是用到pipe (|)直接傳送結果給while read,要注意後面的while read部分會在另外一個shell裡面執行;故在while read迴圈裡面改變變數的數值並不會導致原始script裡面的變數值,這點要很小心

2017年12月10日 星期日

Here string <<< 命令列直接輸出

前面提過可以用 << here document從命令列直接產生檔案,但這個方法最終還要給一個檔案結束的標記。如果用here string <<< 的話,就直接輸出結果,下面幾個指令都是把輸入的字串小寫改成大寫:
  • echo "one two three" | tr a-z A-Z
  • tr a-z A-Z <<< 'one two three'
  • tr a-z A-Z <<< "one two three"
這邊的 <<< 就是所謂的here string。若是要把這個字串存到檔案aFile裡面,輸入:
  • tr a-z A-Z <<< 'one two three' > aFile
  • tr a-z A-Z <<< 'one two three' >> aFile
這裡 > 代表產生新檔案,而代表 >> 的是附加到檔案後面。
Here string可以視為pipe | 的另外一種寫法,從後方輸入

2017年12月9日 星期六

Here document << 命令列直接生成檔案

在命令列之下想要直接將鍵盤輸入的內容存成檔案,這個時候可以用Here document來做。例如說在設定XClock的顏色一文中,需要增加一些設定到~/.Xresource的檔案,這時候可以直接在命令列依序輸入下面的指令:
  1. cat >> ~/.Xresource << _END_
  2. XClock*update: 1
  3. XClock*geometry: 210x210+1020+12
  4. XClock*foreground: #fbfbfb
  5. XClock*background: #000018
  6. XClock.Clock.majorColor: rgba:f0/f0/19/ff
  7. XClock.Clock.minorColor: rgba:a0/c0/f0/ff
  8. XClock.Clock.hourColor:  rgba:c9/66/11/ff
  9. XClock.Clock.minuteColor: rgba:00/82/9f/ff
  10. XClock.Clock.secondColor: rgba:50/93/30/ff
  11. _END_
第1行的 << 代表產生一個here document,前面的 >> 代表將下面綠色的內容附加到~/.Xresource檔案後面。第1行與第11行指令裡面的 _END_ 則是代表當輸入的內容看到的時候,就結束產生這個here document。
若是希望蓋過內容而不是附加到檔案後面,那麼則是要將 >> 改成 > 既可。

_EOF_

2017年12月8日 星期五

用 < 讓檔案直接變成標準輸入

下面三行指令代表的意思是一樣的:
  1. grep phobia /usr/share/dict/words
  2. grep phobia < /usr/share/dict/words
  3. cat /usr/share/dict/words | grep phobia

2017年7月30日 星期日

用cat指令產生一個文字檔案

在終端機內想要產生一個檔案卻又不想要運任何的文字編輯器,可以只用cat配合上IO redirection,例如說:
  • cat > txt << _END_
  • ABCDEFGHI
  • IJKLMNOP
  • QRSTUVWX
  • _END_
以上每打完一行就要按Enter,如果在某一行內打錯字是可以用backspace的,最後的_END_代表的看到某一行是_END_時候,這個檔案就編輯完成可以寫入一個名叫做txt的文件。內容就會是上面指令藍色的部分:
  • cat txt
    ABCDEFGHI
    IJKLMNOP
    QRSTUVWX

2017年1月11日 星期三

tee將STDOUT同時送給多個指令處理

同一個檔案的內容,同時有多個不同程式要來處理,可以直接用tee這個指令搭配process substitution來做:
  • cat file.txt | tee >(command1) >(command2) >(command3) | wc -l