web-dev-qa-db-ja.com

fishの起動時に相対パスを$ PATHに追加します

魚の起動時に$ PATHに./binディレクトリ(現在のシェルディレクトリからの相対パス)を追加したい。 fishはシェルであることに注意してください。

echo $PATH
set PATH ./bin $PATH
echo $PATH

これらの行を~/.config/fish/config.fishシェルは同じパスのコレクションをエコーし​​ます。絶対パスが適切に追加されます。

シェルを開いて同じset PATH ./bin $PATHbinを含むディレクトリ内に追加されました。ただし、現在のディレクトリ内にbinがない場合、エラーが表示されます。

set: Could not add component ./bin to PATH.
set: Value too large to be stored in data type

OS X Lionで魚1.23.1を実行しています。

35

fishが存在しないディレクトリパスをPATHに追加しないようです。これは相対パスにも当てはまります。ただし、ホームディレクトリにbinディレクトリを作成した場合set PATH ./bin $PATHは自宅から実行されるため、起動時に正しく機能します。しかし、これは一種のハックです。

2

$PATHへのパスを永続的に追加するために私が見つけた最良の方法は、

set -U fish_user_paths $fish_user_paths ~/path/name

これは$PATHの前に追加します。また、永続的であるため、パスはシェルの再起動時に$PATHのままになります。

config.fishにコマンドを入力して$PATHを変更するよりも効率的です。これは、シェルを再起動するたびに実行する場合に比べて1回しか実行されないためです。

変数 fish_user_pathsはユーザーが設定することを目的としています1ridiculousfish が述べているように、魚の管理者。


便宜上、fish関数を作成することを検討してください。 2

# ~/.config/fish/functions/add_to_path.fish
function add_to_path --description 'Persistently prepends paths to your PATH'
  set --universal fish_user_paths $fish_user_paths $argv
end

そしてそれを次のように使用します:

$ add_to_path foo bar  # Adds foo/ and bar/ to your PATH

ノート

  1. そのページで、著者は例set -U fish_user_paths ~/binを示します。これにより、fish_user_pathsが単一の値~/binで上書きされます。 fish_user_pathsに設定されている既存のパスが失われないようにするには、追加する新しいパスに加えて、必ず$fish_user_pathsを含めてください(私の回答にあります)。

  2. 私のドットファイルには、重複の追加をスキップする少し高度なバージョンが含まれています https://github.com/dideler/dotfiles/blob/master/.config/fish/functions/add_to_user_path.fish

62
Dennis

これまでfishについて聞いたことがありません。インストールしてみたので、試してみることができました(そして、fishがシェルであることに気付く前に、ここで書いたいくつかの段落を削除しました)。

set PATH dir-name $PATHは、$PATHの前にディレクトリを追加するための正しい構文です。

しかし、relativeディレクトリ名を$PATHに追加することはほぼ間違いなく悪い考えであり、シェルがディレクトリが存在しないときに警告することであなたに好意を示しています。 (fishはユーザーフレンドリーになるように設計されています。)

代わりに絶対パスを使用してください:

set PATH $PWD/bin $PATH

最初に$PWD/binが存在するかどうかを確認し、存在しない場合はエラーメッセージを出力します。

set: Value too large to be stored in data type」メッセージについては、ディレクトリを$PATHに複数回追加していただけませんか?追加する前に、ディレクトリがすでに$PATHにあるかどうかを確認する方法がいくつかあります。

16
Keith Thompson

その答えは、set -Uを使用することは、赤ニシンだと思います。代わりに、以下を~/.config/fish/config.fishに追加します。

if status --is-interactive
    set PATH $PATH ~/.local/bin;
end
10
dhardy

direnv http://direnv.net/ は、あなたがやっていることを手助けする優れたユーティリティです。

共有ディレクトリへの書き込みアクセス権を持つユーザーは誰でも、たとえば。 ./bin/ls。このコードは、共有ディレクトリでlsを実行すると実行されます。

direnvはこの問題を解決しません(.envrcファイルに基づいて機能しますが、誰でも配置できます)が、少なくとも、ディレクトリにcdすると、$ PATHが変更されていることがわかります。

$ cd my_project
direnv: loading .envrc
direnv export: ~PATH
5
Florian D