2011-10-19 45 views
2

如何在bash腳本中將某些行寫入文件?用bash腳本將一些行寫入文件

我想寫以下到一個文件~/.inputrc

"\e[A": history-search-backward 
"\e[B": history-search-forward 
"\e[C": forward-char 
"\e[D": backward-char 

目前我有這個工作,但有些醜陋的方法,我敢肯定,應該有更好的方式。

#!/bin/sh 
echo \"\\e[A\": history-search-backward > ~/.inputrc 
echo \"\\e[B\": history-search-forward >> ~/.inputrc 
echo \"\\e[C\": forward-char >> ~/.inputrc 
echo \"\\e[D\": backward-char >> ~/.inputrc 
+0

總是有幾十個這樣搞不同的方式,但你必須在這裏看起來像最簡單的,以可能是最好的方式做到這一點。 – chown

回答

10

一個稍微簡單的方法是:

cat > ~/.inputrc << "EOF" 
"\e[A": history-search-backward 
"\e[B": history-search-forward 
"\e[C": forward-char 
"\e[D": backward-char 
EOF 

我很好奇,爲什麼你需要,雖然做到這一點。如果你想用一些特定的文本設置一個文件,那麼你可能應該創建這個框架文件,並將它轉儲到/etc/skel。然後,您可以在腳本中使用cp /etc/skel/.inputrc ~/.inputrc

+0

這個工作,但你能解釋語法? –

+1

@JonathanLin這是一個[here doc](http://tldp.org/LDP/abs/html/here-docs.html)。它允許你發送任意文本到一些命令的標準輸入,在這種情況下,貓,並進行處理。 'EOF'用於指示文本何時完成。否則,它只是一個寫命令的cat命令。 –

0

就是這樣。

這裏的減少冗餘的一種方法:

TEXT="\"\\e[A\": history-search-backward 
\"\\e[B\": history-search-forward 
\"\\e[C\": forward-char 
\"\\e[D\": backward-char" 

echo "$TEXT" > ~/.inputrc 
+0

不需要'$ TEXT';只是'echo'[multiple lines]「>〜/ .inputrc'。 –

+0

而你的版本在'$ TEXT'周圍沒有雙引號時就不起作用(我已經添加了它們)。在發佈之前請測試代碼,或者提及它未經測試。 –

3

使用here document

#!/bin/bash 
cat >~/.inputrc <<EOF 
"\e[A": history-search-backward 
"\e[B": history-search-forward 
"\e[C": forward-char 
"\e[D": backward-char 
EOF 

這可以讓你把數據內嵌在你的shell腳本。字符串EOF可以是任何你想要的,所以只需選擇一行中沒有出現在單個行上的字符串。

2

echo命令用於除簡單字符串之外的其他操作可能很複雜且不可移植。有一個GNU版本echo(coreutils的一部分),你可能會在MacOS上找到BSD版本,並且大多數shell有echo作爲內置命令。所有這些不同的版本可以有不同的處理選項命令行選項的方式(禁止尾隨換行符的-n,啓用或禁用反斜槓轉義的-c/-C)和轉義(\e可能是也可能不是轉義字符的編碼) 。

printf來救援。

printf大概可以作爲/usr/bin/printf和/或/bin/printf,並且它也內置了一些貝殼(bash和zsh的反正),但它的行爲更加一致。

Here's the GNU coretuils printf documentation.

對於你的榜樣,你可以寫:

(
    printf '"\e[A": history-search-backward\n' 
    printf '"\e[B": history-search-forward\n' 
    printf '"\e[C": forward-char\n' 
    printf '"\e[D": backward-char\n' 
) > ~/.inputrc