シェルで.bash_profile / .profile / bashrcに関数を追加する方法は?


24

エポック時間を日付に変換する関数があります。定義はこちら

date1(){
  date -d @$1
}

私が書きたいのは:

$ date1 xxxyyy

ここで、xxxyyyは関数に渡すパラメーターであるため、対応する日付を取得できます。私はどちらかでそれを追加する必要があります理解し.bash_profile.profileあるいは.bashrc、それをソース:

$ source file

しかし、どのファイルを入れるかわからない。現在、私はそれを持っている.profile。しかし、それを実行するには、source .profile毎回実行する必要があります。

理想的には、コンピューターが環境変数のように起動したときに、それを使用可能にする必要があります。


入力サンプルの場合。1.テキスト出力epochconverter.comは現在1514917788です; 2. bash自体から$ date + stackoverflow.com/questions/1092631/%s
…AnneTheAgile

回答:


25

からman bash

bashが対話型ログインシェルとして、または--loginオプションを使用した非対話型シェルとして起動されると、bashは最初にファイル/ etc / profileが存在する場合、ファイルからコマンドを読み取って実行します。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、および〜/ .profileをこの順序で探し、最初に存在して読み取り可能なコマンドを読み取って実行します。

言い換えれば、あなたは、のいずれかにそれを置くことができ~/.bash_profile~/.bash_loginまたは~/.profileまたは任意のファイルはsource、それらのいずれかによってdを。通常、「ログインシェル用に実行される個人用初期化ファイル」である~/.profilesource ~/.bashrcを使用します。

有効にするには、新しいシェルを起動するか、実行するexec $SHELLか実行しsource ~/.bashrcます。


1
さて、引数を出力するカスタム関数を作成する方法を試しましたが、その関数を追加して.bash_profilesource ~/.bash_profile、ショートカットで端末を開くたびに実行する必要がありCtrl+Alt+Tます。
ヴィッキーDev

@VickyDev source ~/.bash_profile毎回する必要がある場合、それはBashのセットアップが何らかの形で非標準または壊れていることを示しています(man bash言及された出力による)。実際にBashを実行していますか?たとえば、echo $BASHPID何かを印刷しますか?
-l0b0

関数を定義する#!/bin/shには上部に追加する必要があり.profileますか?
コロブキャニオン

13

で関数を定義したら.profile、を追加しますexport -f date1。これにより、ログインシェルで使用する関数がエクスポートされます。


+1をエクスポートするため、ssh ProxyCommandで呼び出してエイリアスを作成する必要がありましたが、source .profileの後でもエイリアスが見つからないという問題が続いていました。エクスポート後、チャームのように機能します。
アビシェークアナンド

7

対話型シェルのカスタマイズはに入り~/.bashrcます。ログイン時に実行したいものにアクセスします~/.profile(または~/.bash_profile、しかし、グラフィカルにログインするときにロードされないことがよくあります)。

この関数定義をに入れ~/.bashrcます。

bashはロードされませんので.bashrc、それはログインシェルだとき、そうすることを強制する:書き込みが~/.bash_profile含みます

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

すなわち、load ~/.profile、およびload~/.bashrcシェルがインタラクティブな場合。

.bashrcの代替とそこにリンクされている投稿参照してください。


1

cshとtcshはbashのような機能をサポートしていませんが、あなたはそれを行うことができます。

たとえば、テキストを印刷する簡単な関数を次に示します

alias print_hello_world 'eval echo "hello world"'

引数をスクリプトに渡す

repeate_after_me 'eval echo "$1"'

ifステートメントのような複数行のコードを実行することは、やや複雑ですが、ここに行きます。

alias X 'eval "if (\!:1 =~ 'yes') then \\
          echo yes \\
          else \\
          echo no \\
          endif"'

まだ評価する必要がありますが、最も複雑な部分は \!:[x]、コマンドラインから入力を取得する構文を実行することです。

これで整理できます。


0

typesetを使用して、現在のすべての関数をbashrcにリダイレクトできます

たとえば、bashrcにオプションのパラメーターを指定してopenstackコマンドの機能を追加する方法を次に示します。

urc() { . stackrc; set -x; openstack server list --all $1; set +x; }
typeset -f >> ~/.bashrc

今後のセッションのために保存され、次のように使用できます。

$ urc 

または

$ urc --debug

-1

ポイント18:私の古い記憶では、管理者がkshとbashを学ぶのは逆でした。1:-/ etc / profileの内容はsysWideです。/ etc / skelには、新しいアカウントに与えられたファイルが含まれていました。Bashは現在、すべてのディストリビューションに共通のプライムです。次は2:-/ .. system standardとしてのプロファイルです。.profile "if exists"の内容内に.bash_profileは次を置きます-> 3:-.bash_profile 4:-.bash_login 5:-。bashrc .bash_aliasesはより正確な順序、標準のターミナルおよびシェル環境のセットアップ、および通常の.bash_loginが見つからないか、存在しない(ユーザーごとのカスタム)と思います。.profile $ PATHがメインの場合。
私は今も追加していることに気づいています.bash_profile .profileは依然として優勢であり、.bash_profileの存在を尊重していません。ヘッダー情報とともに、誰も更新していません。例:bashスタートアップサンプル-そのディレクトリ構造はもはやありません-例やファイルとともにgzipされています。Gnu-Bashへのアップデートは順調です


1
何をしているの?
Jesse_b
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.