2017-01-05 9 views
0

複数のマシンに同じbash機能をインストールできるbashスクリプトを作成しようとしています。この特定の機能は、バックアップディレクトリのタイムスタンプを持つファイルのコピーを作成します。ここではbashスクリプトを使って変数を含むbash関数をインストールするには?

filebackup() { cp "${@}" ~/"filebackup/${@}_$(date +%Y-%m-%d_%H:%M:%S).bk"; } 

は私のbashスクリプトです:私は、スクリプトを実行すると、

cat <<EOT >> ~/.bashrc 
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

# create a file backup in ~/filebackup/ with timestamp 
filebackup() { cp "${@}" ~/"filebackup/${@}_$(date +%Y-%m-%d_%H:%M:%S).bk"; } 
EOT 

source ~/.bashrc 

しかし、${@}が欠落しており、 $(date +%Y-%m-%d_%H:%M:%S)が評価されました。

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

# create a file backup in ~/filebackup/ with timestamp 
filebackup() { cp "" ~/"filebackup/_2017-01-05_12:07:56.bk"; } 

どのように機能が文字通りファイルにコピーされていることを確認することができます:ここで.bashrcファイルに追加されたものでしょうか?

+0

行1(「行6」ではなく)の「EOT」」を引用してください。 –

+0

@thatotherguy * Easy Button *をプッシュします。 _簡単でした!_ありがとう! –

+0

@DanFarrell私は同じような質問の検索でかなり徹底的だったと感じます...新しいユーザーとして、他の質問の用語は私がよく知っているものではないため、それを見つけられませんでした。 –

答えて

2

ここでは、二重引用符で囲まれた文字列として扱われるため、コマンド展開前にパラメータ拡張とコマンド置換が評価されます。区切り文字の任意の部分を引用すると、ここの文書を一重引用符で囲んだ文字列として扱うことができます。

cat <<\EOT >> ~/.bashrc 
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

# create a file backup in ~/filebackup/ with timestamp 
filebackup() { cp "${@}" ~/"filebackup/${@}_$(date +%Y-%m-%d_%H:%M:%S).bk"; } 
EOT 

は、あらゆる部分では、私は、次のいずれかが同じようにうまくいくだろう意味:

  • 'EOT'
  • E\OT
  • "E"OT

エトセトラ。

+0

ありがとうございます。 –

0

コメント欄に@thatotherguyが提案しています.1行目の "EOT"(ただし、6行目ではない)を引用してください。

cat <<"EOT" >> ~/.bashrc 
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

# create a file backup in ~/filebackup/ with timestamp 
filebackup() { cp "${@}" ~/"filebackup/${@}_$(date +%Y-%m-%d_%H:%M:%S).bk"; } 


EOT 

source ~/.bashrc 
関連する問題