$ PATHにディレクトリを追加するときにすべてのサブディレクトリを追加することが可能


8

PATH =〜/ my_program / bin:” $ {PATH}”によってディレクトリを$ PATHに追加する場合

  1. $ PATHを介してディレクトリ直下の実行可能ファイルのみが見つかりますが、そのサブディレクトリの下の他の実行可能ファイルは見つからないのは本当ですか?
  2. そのすべてのサブディレクトリを追加することは可能ですか?多くの場合、すべてのサブディレクトリを明示的に指定すると、多くの作業が必要になることがあります。

よろしくお願いします!

回答:


5

このスクリプトはtree...を使用します

  • sudo apt-get install tree

変更することでディレクトリの深さを変更-L 1
でき、使用するかどうかを選択できます~/...

更新2
.. 先頭の / home / user /(「any」ではない)のみを置き換えるようにスクリプトを変更し、
引数を追加しました。

UPDATE追加されたチェック:.. PATHにすでにある場合は、PATHにディレクトリを追加しないでください。このチェックでは、「〜/」と「/ home / user /」が異なると見なされます。

あなたの質問1について...はい、それは本当です。特定の各ディレクトリは、PATHで個別に指定する必要があります。

あなたの質問2再...ここにあなたが...やりたいするスクリプトである
私はそれをテストしてみたが、それはそれは、現在のセッションの新しいパスを行います立って...
あなたが使用することができ、それは永続的なものにするにはexport PATH(ただし、の詳細については少し大ざっぱですexport

#
# name: path-add-dirs
# eg: $ path-add-dirs "$HOME/bin" "tilde" 1

# When directories are $HOME based, choose format.
# Add directories in tidle format: ~/...
#       ...or as fullly-qualified: /home/user/...

# mode values: "tilde", or  anything else for fully-qualified   
mode="$2" # valid mode values: "tilde", or  anything else   
maindir="$1"; dirs= ; echo
# Buld string of subdirectories to a depth/level of 1  
while IFS= read -r dir ; do
  # Don't add directory if it is already in PATH
  if [[ "$mode" == "tilde" ]] ; then
    # replace only a *leading* :/home/user/ 
    homecheck=":$dir"                    
    dircheck="${homecheck/:$HOME\//:~/}"
    dircheck="${dircheck#:}"
  else
    dircheck="${dir}"
  fi;
  pathcheck=":$PATH:"
  if [[ "$pathcheck" != "${pathcheck/:$dircheck:/}" ]] ; then  
    echo "ALREADY IN PATH: $dircheck"
  else
    dirs="$dirs:$dir"  
    echo " added: $dircheck"
  fi
done < <(tree --noreport -L $3 -fi -d "$maindir")
# Choose one of these two options
if [[ "$mode" == "tilde" ]] 
then PATH="$PATH${dirs//:$HOME\//:~/}" # change :$HOME to :~/ 
else PATH="$PATH$dirs" # this method has fully expanded $HOME
fi
echo
echo "$PATH"
echo

3

UNIXベースのシステムはそのように動作するように設計されていないため、それは不可能です。通常、すべての実行可能ファイルは、少数のディレクトリの1つに置かれます。たとえば、私が自分の目的で書くものはすべて〜/ binにあります。

実際のバイナリとスクリプトをbinディレクトリに保存したくない場合は、たとえば〜/ binに実際のバイナリへのシンボリックリンクを作成できます。

$ PATHにすべてのサブディレクトリを含めることは、検索するディレクトリを追加するだけなので、特に望ましいわけではありません。他の実行可能ファイルがPATHに入らない可能性が高くなり、実際にはあまりメリットがありません。


3

これでうまくいくはずです

PATH="$PATH:$(find ~/bin -type d -printf ":%p")"

それを考慮に入れてください

  • ディレクトリツリー全体が走査されるため、時間がかかる場合があるため、階層を小さく保つようにしてください。
  • これは、PATHの設定後に作成されたディレクトリを考慮に入れません。
  • これを複数回呼び出すと、PATHに多くの重複が発生します。元のPATHを一時変数(OLD_PATHなど)に割り当てたい場合があります。

2つのバグ:絶対パスが追加されない->正しく機能しない。また、2つの二重コロンが追加されます。削除:$ PATHの後。
Olli

1

いいえ、簡単にはできません。すべての実行可能ファイルへのソフトリンクを「〜/ my_program / bin」に追加する可能性はありますか?


1

このようにしてみてください:

export PATH="$PATH:$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':' | sed 's/:*$//')"

これ~/.local/binにより、すべてのサブディレクトリと一緒に自分自身がに追加され$PATHます。

説明:

  • du 各行にすべてのサブディレクトリ情報を表示します
  • cut -f2 2番目の列、つまりサブディレクトリの名前を抽出します
  • tr '\n' ':'各リンクの区切りをコロンに変更します。これはすべての行を単一の行に結合し、サブディレクトリはコロンで区切られます
  • sed 's/:*$//' 最後のコロンを削除します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.