web-dev-qa-db-ja.com

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

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

album-01album-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を作成するには?

10
Hidayats

私はまだ実際の17.04システムでこれをテストすることはできませんでした(16.04で動作することを確認しただけです)が、cd Bash組み込みコマンドを独自のカスタム関数でオーバーライドできます。最初の引数を除く引数:

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

更新:@ muruのコメント で示唆されているように、以下のこのバージョンはよりよく機能し、引数なしのcdの呼び出しをサポートする可能性がありますしかし:

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

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

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

9
Byte Commander

簡単な回答/回避策

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

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
7
Grayson Kent

常に Tab Completion。 を使用しているため、この問題に遭遇したことはありません。

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

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

cd Un Tab

cd Unknown

に続く TabTab 生産する

Unknown/                        Unknown Artist - Unknown Album/ 
5
Elder Geek

これは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

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

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

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

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

2
fkraiem