Ubuntu 16.04を17.04にアップグレードしたところ、cd
コマンドに小さな問題が見つかりました。
album-01
とalbum-02
の2つのフォルダーがあるとします。
Ubuntu 16.04では、cd album*
を実行すると、最初に見つかったフォルダーalbum-01
に移動します
しかし、新しいUbuntu 17.04では、cd album*
を実行すると、結果は-bash: cd: too many arguments
になります
Ubuntu 16.04のcd
のようにUbuntu 17.04でcd
を作成するには?
私はまだ実際の17.04システムでこれをテストすることはできませんでした(16.04で動作することを確認しただけです)が、cd
Bash組み込みコマンドを独自のカスタム関数でオーバーライドできます。最初の引数を除く引数:
cd(){ command cd "$1" ; }
更新:@ muruのコメント で示唆されているように、以下のこのバージョンはよりよく機能し、引数なしのcd
の呼び出しをサポートする可能性がありますしかし:
cd(){ builtin cd "${@:1:1}"; }
上記の行を端末に入力した後、cd
が希望どおりに動作するかどうかを確認してください。この場合、~/.bashrc
ファイルの最後にその行を追加することにより、この関数定義を永続化できます。それ以外の場合は、現在のシェルセッションを終了するとすぐに消えます。
何らかの理由で、このカスタム関数の代わりに実際のcd
Bash組み込みコマンドを一時的に使用する必要がある場合は、単純なcd
の代わりにcommand cd
で呼び出すことができます。
この正確なケースであなたの質問に答えるために、これはうまくいきます
cd album*1
しかし、それはおそらくあなたが本当に望んでいる機能ではないでしょう。
Bash-4.4で config-top.h
が更新され、次のオプションが追加されたようです
/* Define CD_COMPLAINS if you want the non-standard, but sometimes-desired
error messages about multiple directory arguments to `cd'. */
#define CD_COMPLAINS
そして、 builtins/cd.def
はここでのエラーを指します:
#if defined (CD_COMPLAINS)
else if (list->next)
{
builtin_error (_("too many arguments"));
return (EXECUTION_FAILURE);
}
#endif
長期的に何ができますか?:
新しいCD_COMPLAINSなしで独自のbash
をコンパイルできますが、それは退屈になります。ここで提案したようなcd
機能を再定義するか、次のような関数のエイリアスを作成できます。
cd "$(find $1* | head -1)"
それを証明する
まだ機能するBash 4.4ベータ版
#Pulling and unpacking source
$ wget https://ftp.gnu.org/gnu/bash/bash-4.4-beta.tar.gz
$ tar -xzvf bash-4.4-beta.tar.gz
$ cd bash-4.4-beta
#Building, go grab something to drink. It's gonna be a while.
~/bash-4.4-beta$ ./configure
~/bash-4.4-beta$ make
#Check Version
~/bash-4.4-beta$ ./bash --version
GNU bash, version 4.4.0(1)-beta (x86_64-unknown-linux-gnu)
#Enter a clean interactive Prompt
~/bash-4.4-beta$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norc
#Test example
bash-4.4$ mkdir album-0{1..2}
bash-4.4$ cd album* && pwd
/home/gkent/bash-4.4-beta/album0-1
動作しないBash 4.4安定版リリース
#Pulling and unpacking source
$ wget https://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz
$ tar -zxvf bash-4.4.tar.gz
$ cd bash-4.4/
#Building, go grab something to drink. It's gonna be a while.
~/bash-4.4$ ./configure
~/bash-4.4$ make
#Check Version
~/bash-4.4$ ./bash -version
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)
#Enter a clean interactive Prompt
~/bash-4.4$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norc
#Test example
bash-4.4$ mkdir album-0{1..2}
bash-4.4$ cd album*
bash: cd: too many arguments
常に Tab Completion。 を使用しているため、この問題に遭遇したことはありません。
したがって、あなたの場合、どのディレクトリが不正確かを推測するのではなく、cd al
と入力します。Tab 一致が1つしかない場合はそれを完了し、一致が終了するまで2つ以上完了している場合、 TabTab 選択肢をリストします。
これが私のシステムの例です:
cd Un
Tab
cd Unknown
に続く TabTab 生産する
Unknown/ Unknown Artist - Unknown Album/
これはBashのバグのように見えます。man builtins
ごとに、古い動作は正しい動作です。
cd [-L|[-P [-e]] [-@]] [dir]
Change the current directory to dir. if dir is not supplied,
the value of the HOME Shell variable is the default. Any
additional arguments following dir are ignored.
bug-bash
メーリングリストでバグを報告できます。詳細 こちら 。
実際、バグは報告されました(ずっと前)。今、修正されたBashが必要な場合、now、これを適切に行う方法を次に示します(17.10でテスト済み、他でも動作するはずです)。
最初に、作業するディレクトリを作成します。次に例を示します。
mkdir ~/bash
cd ~/bash
ソースパッケージとビルドの依存関係を取得します。
apt-get source bash
Sudo apt-get build-dep bash
cd bash-4.4
config-top.h
を編集してこれを変更します(32行目)
#define CD_COMPLAINS
これに
/* #define CD_COMPLAINS */
debian/changelog
を編集し、このようなエントリを上部に追加します(コマンドdch -i
も使用できます)。
bash (4.4-5ubuntu1+cd) artful; urgency=medium
* Fix cd.
-- Firas Kraiem <[email protected]> Thu, 04 Jan 2018 21:11:22 +0900
最も重要な点は、+foo
をcurrentバージョン番号に追加することです(foo
can小文字の任意の文字列であり、dch -i
を使用する場合は注意してください。最後の数字が増加するため、現在の数字に戻す必要があります)、正しいリリース名(ここではartful
)を使用する必要があります。最後に、dpkg-source --commit
を実行します。
その後、debuild
コマンドを実行できます。すべてがうまくいけば(debsign
に関するエラーは無視できます)、親ディレクトリに.deb
sが必要です。これは通常どおりインストールできます(すべてをインストールする必要はありません)それら、あなたが今持っているもの; dpkg -l | grep bash
を使って調べてください)。
bash
への今後の更新を自動的に取得できるように、新しいパッケージのバージョン番号が設定されていることに注意してください。更新で問題が解決しない場合は、上記のプロセスを繰り返す必要があります。
(この回答は最初に この重複した質問 に投稿されました)