bash-as-sh エコ-n

bash-as-sh エコ-n

bash(重要な場合はバージョン3.2.57(1))にshをエミュレートするモードで組み込み-nオプションを実装させる方法はありますかecho

echo -n特に、M個の異なるスクリプトでN個の呼び出しを見つけて書き換えるのではなく、長年にわたってうまく機能してきた(たぶん不運かもしれません)どこかに設定するオプションがあるかどうか疑問に思います。明らかにbashの組み込み関数はecho これを行うことができます-n。なぜなら、フルbashモードでは可能だからです。

echo -n[免責事項:はい、最初は移植性がないことを知っていますが、printfお勧めします。 ]


注:1つのコメントは、このbashバージョンが「17年前」と指摘しました。誰かがこれをAppleに知らせる必要があります。これは、私が新しく購入したMacにインストールされたMacOS Ventura 13.0に同梱されているバージョンです。

答え1

私が思いつく最善のアイデアは、組み込み機能をGNU coreutilsのecho「本当の」実行可能ファイルに置き換えることです。これはbashがある場合はほぼ確実にインストールされています。echo

echo() { "$(type -P echo)" "$@" ; }

内蔵アイテムを隠すだけです。

GNU Coreutilはecho.c実際にはそれほど長くないので、「私はUNIX System Vで動作していますが、この動作は予想されますか?」などの特殊なケースでは、処理、--help印刷、および同様の作業が大部分を占めています。厳しく必要に応じて、シェルスクリプトに小さなC実装を含め、echoPOSIX指定手段を介してそれらを配置することを検討できます(c99実装したことがある場合)。これは2000年代のマシンなので、Perlがあると仮定してPerlで同じ機能を実装することをお勧めします。

答え2

見たようになぜprintfがechoより優れているのですか?、同時に有効になっている場合(たとえば、呼び出し時に)、およびこのオプションが有効になっている場合(bashがUNIX互換であるように構築されたシステムのデフォルト)、bashこのオプションはサポートされていません(/-n同様)。-e-Eposixshxpg_echo

したがって、bash(および/およびその組み合わせ、たとえば...)のechoサポートを受けるには、これらのオプションのいずれかまたは両方を無効にする必要があります。これ以上のUNIX互換性を維持するには、この機能をオフにする必要があります。-n-e-Eecho -enecho -e -nsh-nxpg_echo

shopt -u xpg_echo

例:

$ bash -o posix -O xpg_echo -c 'echo -n a'
-n a
$ bash -o posix -O xpg_echo -c 'shopt -u xpg_echo; echo -n a'
a

-nbashは、印刷されていないものを除いて、ほとんどの場合UNIXと互換性があります。

$ bash -o posix -O xpg_echo -c 'set +o posix; echo -n a'
a

この処理は有効ですが、-n他の非UNIX準拠も有効になっているため、標準とはあまり似ていませんsh

答え3

私のMacの外部デバイスは/bin/echoそれをサポートしています-n。以下を使用してBashの組み込み機能を無効にできますenable -n

bash-3.2$ enable -n echo
bash-3.2$ type echo
echo is /bin/echo
bash-3.2$ echo -n foo |od -c
0000000    f   o   o
0000003

答え4

基本的な問題を解決する

「upgrade bash macOS」をクエリとして使用すると、Google は多くの結果を返します。ローカル交換回答を使用し、2つの回答を1つにマージします(注意事項に従って)。

GNUライセンスに関するよくある質問:Tivoization

人々がGPLv3に準拠したソフトウェアを含むユーザー製品を展開するとき、セクション6はソフトウェアの修正に必要な情報を提供することを要求します。ユーザー製品は、ライセンスに具体的に定義されている用語です。ユーザ製品の例には、ポータブル音楽プレーヤー、デジタルビデオレコーダ、およびホームセキュリティシステムが含まれる。

AppleのDarwin OSは約10.5からプライベートソースだったので、アップグレードされたBASHを提供することは上記の段落に違反するので、Appleは知っています。 BASHシェルを更新してデフォルトのシェルにする方法があります。

Homebrewで更新されたBashのインストール

以下を端末に貼り付けます。

  1. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"ラインで。
  2. 質問brew install bash

HomebrewにBASHの更新版をインストールし、それをシンボリックリンクする必要があります。which bashデフォルトの場所に設定したい場所を見つけるために使用されます。

  1. 編集する/etc/shells
  2. ファイルの末尾にパス+バイナリを追加します。
  3. 環境を更新するには、ログアウトしてもう一度ログインしてください。
  4. 「Change Shells」コマンドを使用して、chsh新しいBASHバージョンへのパスを提供します。これにより、新しいバージョンがデフォルトのシェルになります。

源泉

関連情報