そのため、エクスポートされた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/sh
POSIXのように動作し、準拠しようとするとエラーが表示されます。bash
bash
sh
sh
https://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_aliases
bashを実行したときにのみファイルがインポートされます。
明確にするために、あなたの質問と意見の情報に基づいて、ここで何が起こっているのかを仮定します。
SSH経由でコンピュータに接続しています。
SSH を使用すると、デフォルトの
/bin/sh
ログインシェルが起動します。これはログインシェルなので
~/.profile
。設定
.profile
はソースコード(やはり標準ではありませんが一般)なので、bashを実行しなくても~/.bashrc
今すぐ読むことができます。.bashrc
設定
.bashrc
がsource~/.bash_aliases
なので、ファイルを読み込んでエラーを生成します。
個人的にこの作品が好きではないもう一つの理由一部のシステムで行う決定デフォルト~/.bashrc
ソースを作成します~/.profile
。