Ubuntu 17.04 — bash:cd:引数が多すぎます


10

Ubuntu 16.04を17.04にアップグレードしたところ、cdコマンドに少し問題が見つかりました。

2つのフォルダがあるとします:album-01album-02

Ubuntu 16.04ではcd album*、最初に見つかったフォルダに移動しますalbum-01

しかし、新しいUbuntu 17.04では、実行cd album*すると -bash: cd: too many arguments

Ubuntu 16.04のcdようcdにUbuntu 17.04で作る方法は?


4
cd2つの場所を指定しているため、取得した内容は理にかなっています。
mikewhatever 2017

1
@mikewhatever残念ながら、Bashのマニュアルはあなたに同意しません:「ディレクトリに続く追加の引数は無視されます」
muru

3
誰かが興味を持っている場合に備えて、バグレポートを投稿しました:bugs.launchpad.net/ubuntu/+source/bash/+bug/1683576
muru

質問が満足に解決された場合、左側にある灰色の丸いチェックボタンをクリックして最も役に立った回答を受け入れることを忘れないでください。
バイトコマンダー

回答:


9

これを実際の17.04システムでテストすることはまだできませんが(16.04で動作することを確認しただけです)、cdBash組み込みコマンドを独自のカスタム関数でオーバーライドして、最初の引数以外の追加の引数をすべて破棄できるはずです。:

cd(){ command cd "$1" ; }

更新:@muruのコメントで提案されているように、以下のこのバージョンはより適切に機能し、cd引数なしの呼び出しをサポートします。

cd(){ builtin cd "${@:1:1}"; }

ターミナルでこの行を入力した後、cd今希望どおりに動作するかどうかを確認してください。この場合は、~/.bashrcファイルの最後にその行を追加することで、この関数定義を永続化できます。それ以外の場合は、現在のシェルセッションを終了するとすぐに消えます。

何らかの理由cdで、このカスタム関数の代わりに実際のBash組み込みコマンドを一時的に使用する必要がある場合は、単純にではcommand cdなくで呼び出すことができますcd


私は同じことを書いていましたが、関数の代わりに小さなスクリプトのエイリアスを提案していました...確実に機能します;)
Ravexina

@Ravexina最初にエイリアスを使用することも検討しましたが、引数を制御できないため、エイリアスでは実行できないと考えて、それを削除しました。好奇心から、あなたはどのようなアプローチを提案しましたか?
バイトコマンダー

私は同じことは、私はちょうどでコードを入れなかった.shように、その後のエイリアスを作成したファイル:mcd="source /home/user/bin/cd.sh"
Ravexina

あ、そう。これは必要以上に複雑ですが、動作するはずです。
バイトコマンダー

2
@SandiHidayat cd () { builtin cd "${@:1:1}"; }代わりに試してください。
muru

7

短い答え/回避策

この正確なケースであなたの質問に答えるために、これはうまくいきます

cd album*1

しかし、おそらくあなたが本当に望んでいる機能ではありません。

何が変わったの?

と思われるconfig-top.hのBash-4.4で、次のオプションを追加するように更新されました

/* 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

長期的に何ができますか?:

bash新しいCD_COMPLAINSなしで独自にコンパイルすることもできますが、これは面倒です。cdここで提案されているように機能を再定義するか、次のような関数に別名を付けることができます

cd "$(find $1* | head -1)"

それを証明する

まだ機能するBash 4.4 Beta

#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 Stableリリース

#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

申し訳ありませんが、タイプミスでした。回答を更新しました。
グレイソンケント

ああ、そうです。大かっこがなくても、最後cd alb*1のリテラルに一致するように、単に行うことができ1ます。最初はあなたの考えを他のものと混同しました。
ilkkachu 2017

5

私は常にタブ補完を使用しているため、この問題に遭遇したことはありません

したがって、あなたのケースでは、どのディレクトリが欲しいかについて不正確な推測をするのではなく、cd alTab一致が1つだけの場合はそれを入力し、2つ以上の場合は一致を終了しTabTabて選択肢をリストします。

これが私のシステムの例です:

cd Un Tab

cd Unknown

続いてTabTab農産物

Unknown/                        Unknown Artist - Unknown Album/ 

2

これは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を今すぐ、今、、正しく実行する方法を次に示します(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 <firas@fkraiem.org>  Thu, 04 Jan 2018 21:11:22 +0900

最も重要な点は+foo現在のバージョン番号に追加するfooことです(小文字の任意の文字列にすることができます。また、を使用する場合は注意してください。dch -i最後の番号が増分されるため、現在の番号に戻す必要があります)。正しいリリース名(artfulここ)。最後に、を実行しdpkg-source --commitます。

その後、debuildコマンドを実行できます。すべてがうまくいった場合(エラーdebsignは無視できます).deb、親ディレクトリにいくつかのsが必要です。これは通常どおりインストールできます(すべてをインストールする必要はありません。今持っている; dpkg -l | grep bash見つけるために使用してください)。

新しいパッケージのバージョン番号は、将来の更新が自動的に取得されるように設定されていることに注意してくださいbash。更新しても問題が解決しない場合は、上記のプロセスを繰り返す必要があります。

(この回答は、最初にこの重複した質問に投稿されました。)

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