インポートされたbash関数からshエラーを取り除くには?

インポートされたbash関数からshエラーを取り除くには?

そのため、エクスポートされたbash関数がたくさんある.bash_aliasesファイルがありますが、その多くはshと互換性がありません。

問題は、shが私のラップトップ(OS X)とSSHを接続するLinuxボックスのどこでも使用されることです。また、常にbash機能とスパムエラーを取得しようとします。

問題の機能は次のとおりです。

  • 名前に「-」を含むすべての機能(注:LinuxではなくOS Xのスパムエラー)
  • そして構文がbashでのみ有効なlog()関数(以下)

    log() {
        # braces allow for piping of same output to multiple files
        { $@ 2> >(tee .err.log); } &> >(tee .out.log);
        echo; echo logged output to .err.log \& .out.log respectively;
    }
    export -f log
    

それでは、この問題をどのように解決するのですか?関数の名前を変更したり、* / binディレクトリに別のスクリプトに入れる必要がない場合は、より良いようです。

助けてくれてありがとう!

PSスクリーンショット:

ここに画像の説明を入力してください。

編集:情報が十分ではないことに気づきました。はい。.bash_profileソース.bashrcはソースです.bash_aliases(私はソースがありません.profile)。また、.bash_aliasesに終了句を作成しましたが、うまく$SHELL='sh'いきません。自分の環境から直接インポートする(@Bodoと同様に輸入スクリーンショットのエラー表示)。

編集2重要な注意:また、奇妙なことに、Linuxボックスから/ bin / shにsshを送信することがわかりました。bashへのシンボリックリンク。。これはbashを意味します。購入時にエラーは発生しません。環境からインポートすると、log()は実際にエラーを引き起こしますか?

答え1

これらの関数をエクスポートしないでください。代わりに、必要な.bash_aliasesすべてのインスタンスにリソースを提供することをお勧めします。bash(対話型シェルの機能だけが必要だと思いますbash。)

同様の質問がここに記載されています。/bin/sh: 'some-function' の関数定義の取得中にエラーが発生しました。、ここで受け入れられる答えは関数の名前を変更することを示唆しています。

システムに接続していても、/bin/shPOSIXのように動作し、準拠しようとするとエラーが表示されます。bashbashshshhttps://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Invoked-with-name-sh

答え2

簡単な解決策はそれらを調達することではありません。標準ファイルではないため、~/.bash_aliases構成ファイルのいずれかから明示的にインポートする必要があります。したがって、簡単な解決策は、対応するソースライン(ほとんどのソースライン~/.bashrc)を見つけて次から変更することです(またはシステムにあるものは何でもUbuntuから取得されます)。

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

これに関して:

if [ -f ~/.bash_aliases ] && [ -n "$BASH_VERSION" ]; then
    . ~/.bash_aliases
fi

これにより、.bash_aliasesbashを実行したときにのみファイルがインポートされます。


明確にするために、あなたの質問と意見の情報に基づいて、ここで何が起こっているのかを仮定します。

  1. SSH経由でコンピュータに接続しています。

  2. SSH を使用すると、デフォルトの/bin/shログインシェルが起動します。

  3. これはログインシェルなので~/.profile

  4. 設定.profileはソースコード(やはり標準ではありませんが一般)なので、bashを実行しなくても~/.bashrc今すぐ読むことができます。.bashrc

  5. 設定.bashrcがsource~/.bash_aliasesなので、ファイルを読み込んでエラーを生成します。

個人的にこの作品が好きではないもう一つの理由一部のシステムで行う決定デフォルト~/.bashrcソースを作成します~/.profile

関連情報