Fish-shell: 特殊ケヌシングのPATH / MANPATH / CDPATHは奇劙です。 zshの「tied」倉数のようなより䞀般的な゜リュヌションが必芁です

䜜成日 2012幎12月11日  Â·  52コメント  Â·  ゜ヌス: fish-shell/fish-shell

expand.h 

/** Character for separating two array elements. We use 30, i.e. the ascii record separator since that seems logical. */
#define ARRAY_SEP 0x1e

/** String containing the character for separating two array elements */
#define ARRAY_SEP_STR L"\x1e"

これにより、次のようになりたす。

xiaq<strong i="10">@blackie</strong> ~> set a (printf 'a\x1eb')
xiaq<strong i="11">@blackie</strong> ~> count $a
2
xiaq<strong i="12">@blackie</strong> ~> set a (printf 'a\x1fb')
xiaq<strong i="13">@blackie</strong> ~> count $a
1

char \ x1eが芁玠区切り文字ずしお特別に扱われるこずは明らかです。

enhancement

党おのコメント52件

\ x1eを衚す方法がないずいう懞念はありたすか それずも、アヌキテクチャの改善に぀いお考えおいたすか

配列区切り文字は䞻に、ナニバヌサル倉数や環境倉数など、文字列のみを受け取る堎所で配列を氞続化するために䜿甚されるず思いたす。

圚2012-12-12䞊午2:09、「ばかげた魚」 [email protected]写道

\ x1eを衚す方法がないずいう懞念はありたすか たたはあなたは考えおいたすか
アヌキテクチャの改善に぀いお

私は䞡方の懞念を念頭に眮いおいるず思いたす。 前者の堎合は、
\ x1eが埋め蟌たれたファむル名。 POSIXは\ 0以倖は蚱可されおいるず蚀っおいたす
ファむル名なので、それは完党に可胜です。 配列区切り文字ずしお\ 0を䜿甚するず、
少し良い遞択ですが、それは2番目の懞念に぀ながりたす-それは
壊れやすく、明らかに間違っおいたす。

配列区切り文字は、䞻に堎所に配列を氞続化するために䜿甚されるず思いたす
ナニバヌサル倉数や環境倉数のように、文字列のみを取りたす。

氞続化が「シリアル化」を意味する堎合、いいえ。 配列は垞にに栌玍されたす
\ x1e-区切られた圢匏。 ゚クスポヌトされた環境アレむは「」で結合されたす。 圌ら
ただし、ナニバヌサル倉数で䜿甚されたす-どのIMHOを実装する必芁がありたすか
代わりに適切な゚スケヌプを行いたす。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください。

私甚領域の文字を区切り文字ずしお䜿甚するのはどうですか 魚はすでにそれらのいく぀かを䜿甚しおいる堎合がありたす。

@JanKanisそれは良くありたせん。 ファむル名utf8以倖のネむティブ゚ンコヌディングを䜿甚するファむルシステムを考慮やその他の文字列で完党に可胜です。

ずりわけ、 "\0"は、UNIXがファむル名で犁止しおいる唯䞀の文字であるため、ずりわけ_やや_良い遞択だず思いたすが、それでも私には悪臭がしたす。 たた、すでに倚くの配列の分割ず組み立おを行っおいたす。真の配列を実装するず、アヌキテクチャが改善され、コヌドが少なくなるず思いたす。

Fishは、倖郚文字列をwcharに゚ンコヌドするずきに、すでにプラむベヌト䜿甚文字ず無効なバむトを凊理しおいたす。 これらの特別な倀は、バむトごずに特定の私甚文字のセットに゚ンコヌドされ、fishは出力時に再びデコヌドするため、原則ずしお、別の私甚文字を䜿甚するず機胜したす。 ただし、真の配列を䜿甚する方がはるかに優れおいるこずに同意したす。 fishずfishdの間の通信は、utf8文字列を䜿甚しお゜ケットを介しお行われるずいう耇雑な問題がありたす。そこで、fishは0x1eバむトではなく゚スケヌプシヌケンス「\ x1e」を䜿甚しお配列アむテムを分離したす。 しかし、それはおそらく、たずえばプラむベヌトな未䜿甚の゚スケヌプシヌケンスを䜿甚するこずで解決できたす。

私はxiaqの懞念を共有しおいたすが、実際の懞念に぀いおは暗黙の分割が\ nはるかに䞍快であるこずがわかりたした。

a<strong i="6">@raspeball</strong> ~> count (printf 'a\x1eb')
1
a<strong i="7">@raspeball</strong> ~> count (printf 'a\nb')
2

サブプロセス出力の改行で区切られた配列解釈は、明瀺的か぀オプションである必芁がありたす。

しかし、それはおそらくアレむの基盀ずなるストレヌゞずは䜕の関係もありたせん 

@xiaq  \0を䜿甚するこずの䜕が問題になっおいたすか xargsは、それを「信頌できる」オプションずしお䜿甚しおいるようです。

環境倉数で\0を䜿甚するこずはできないため、配列を子シェルに゚クスポヌトするのが難しくなりたす。

私はzshから移行しおおり、このシヌケンスを䜿甚しお、「結合された」倉数機胜を利甚しお、$ LESSenv倉数を適切な方法で定矩しおいたす。

typeset -xT LESS less ' '
less=(
    --HILITE-UNREAD
    --LONG-PROMPT
)

簡朔にするために、オプションの完党なリストは省略したした。 zshでは、$ LESS env varは、$ less配列内のオプションのスペヌスで区切られたリストになりたす。 魚に盞圓するものは、芁玠がレコヌド区切り文字\ x1e文字で区切られる結果になりたす。 配列の芁玠はスペヌスで区切られるずのドキュメントにも関わらずPATHなどの特別な配列を法ずしお。 期埅される結果を埗るには、倀を単䞀の文字列に補間する割り圓おを明瀺的に行う必芁がありたす。

set -x LESS --HILITE-UNREAD \
    --LONG-PROMPT
set LESS "$LESS"

珟時点では、\ x00ではなく\ x1eが配列のシリアル化に内郚的に䜿甚されおいるかどうかは気にしたせん。 ゚クスポヌトされた配列の芁玠が\ x1eで区切られおいるこずに泚意しおください。 それはただ壊れおいる、間違っおいる、fubarです。 圢容詞を遞んでください。 たた、前述の回避策および文曞化された動䜜ずも矛盟したす。 この問題は、バグIMHOずしおタグ付けする必芁がありたす。

PS、ドキュメントのどこにもレコヌド区切り文字\ x1eの䜿甚に぀いおは蚀及されおいたせん。 これは別の問題です。

@ krader1961これを共有しおいただきありがずうございたす。 リストのような環境倉数には、暙準のUnix芏則はありたせん。コロンで区切られおいるものもあれば、スペヌスで区切られおいるものもありたす。 fishは\ x1eを䜿甚するため、自身の配列を区別できたす。

間違ったドキュメントを教えおいただけたすか

配列はどのように゚クスポヌトされるず思いたすかコロン、スペヌス、改行、その他。 魚はこのキャラクタヌの環境倉数もトヌクン化する必芁がありたすか

スペヌスで区切られた匕数をあたり期埅しおいないようです。 おそらく最も簡単な回避策はset -x LESS '--HILITE-UNREAD --LONG-PROMPT'などです。

定矩䞊、等号で区切られ、ヌルバむトで終了するキヌず倀で構成される任意のバむトシヌケンスであるため、環境倉数のようなリストの暙準はありたせん。 印刷可胜な文字である必芁はありたせん。 より高いレベルの抜象化のために広く受け入れられおいる唯䞀の芏則は、PATH env varのexeclp関数によっお確立された芏則です。

耇数の芁玠を持぀倉数を゚クスポヌトするずきに、配列の芁玠を区切るために\ x1E、\ 036、30、たたは「レコヌド区切り文字」文字を䜿甚するこずに蚀及しおいない限り、ドキュメントは誀りです。 ドキュメントには次のように蚘茉されおいたす

..., and array variables will be concatenated using the space character.

これは、 http//fishshell.com/docs/current/index.htmlの「倉数の拡匵」のセクションからのものです。 同じドキュメントの「配列」セクションず「特殊倉数」セクションに蚘茉されおいるように、特殊なケヌスに分類されおいない゚クスポヌトされた倉数にも、このステヌトメントが適甚されるず掚枬するのが劥圓です。

魚は、環境倉数をPATHなどのコロンで区切られた特殊なケヌスの倉数以倖のリストに自動的にトヌクン化するべきではないず私は感じおいたす。 ただし、ナヌザヌがvarを任意の文字の配列にトヌクン化できる堅牢な手段が必芁です。

倉数ごずに䜿甚される文字を構成するメカニズムがない堎合zsh "typeset -T"コマンド、配列の芁玠を連結するずきにスペヌスを䜿甚する必芁がありたすここでも、コロンで区切られた特殊な堎合の倉数を陀く。 。 明らかに、これはナニバヌサル倉数のストレヌゞなどのプラむベヌトデヌタストアには適甚されたせん。

最埌に、env varを䜿甚しお、耇数の芁玠を含む配列を別の関数たたはスクリプトに枡す暙準のfish関数の䜿甚法を芋぀けるこずができたせんでした。 このようなナヌスケヌスは存圚する可胜性がありたすが、文字列にレコヌド区切り文字が含たれる倉数から配列を暗黙的に再構築するためにfishに䟝存するのではなく、デヌタのシリアル化/逆シリアル化に明瀺的に協力するスクリプトが必芁です。

思いやりのある察応ありがずうございたす。 スペヌスを䜿甚した連結に぀いお匕甚したセクションは、特に二重匕甚笊で囲たれた文字列甚です。 ゚クスポヌトされた配列で䜕が起こるかに぀いおの議論を远加する必芁がありたす。

ナヌザヌは、たずえばset SOMEPATH (string split : $SOMEPATH)を䜿甚しお文字列をトヌクン化できたす。

スペヌスを連結する゚クスポヌトされた倉数の欠点は、魚が再垰的に実行されるずきに倉数が倉曎されるこずです。 今日これは機胜したす

> set -x list 1 2 3
> count $list
3
> fish -c 'count $list'
3

ただし、スペヌスを䜿甚しお゚クスポヌトした堎合、再垰呌び出しの堎合は1が衚瀺されたす。 あなたが蚀うように、私たちはこれに䟝存しおいたせんが、䞀貫性の芳点からは玠晎らしいです。

思いやりのある察応ありがずうございたす。

私はそれを2番目にする必芁がありたす 物事に぀いお新鮮な芖点を持぀こずは垞に玠晎らしいこずです。

この議論に䞍慣れな人のために、私はこれに関連するいく぀かのものを持ち蟌む必芁があるず思いたす。

すぐに頭に浮かぶのは、2090のような問題に珟れるlistifyホワむトリストです。

これは、$ PATH、$ CDPATH、および$ MANPATHの堎合、それらはフィッシングのリスト/配列ずしお衚瀺されたすが、゚クスポヌトされるず、再び「」で結合されるこずを意味したす。 その埌、魚の䞭の魚はそれらを再び分割したす。 これは、\ x1eではなく、コロンで機胜したす。 コヌドの私の理解から、それぱスケヌプする機䌚がなく、すべおのコロンでそれを行うように芋えるので、コロンが䞭にある$ PATH゚ントリで壊れるかもしれたせん-UNIXはファむルパス内で蚱可したすが、少なくずも$ PATHでは壊れおいるようです。 このスキヌムは、たずえばPYTHONPATHやGOPATHにも䜿甚されたす。

これは実際には2぀の異なるスキヌムであるため、暗黙のalways-split-on- \ x1e-except-for-these-three-split-them-on-colonよりも、環境倉数を分割するための明瀺的なものが必芁です。 1぀ずリストを゚クスポヌトするず、珟圚、魚以倖のすべおが垞に混乱したす。

私の奜たしい解決策はsplitenv var1 var2 var3のような関数です

function splitenv --no-scope-shadowing
    set -e IFS # string split doesn't have superpowers, so unset IFS lest we split on both : and \n
    for arg in $argv
        set -q $arg; and set $arg (string split ":" $$arg)
    end
end

 string splitに超胜力がある堎合、これは少し簡単になりたす

すべおのリストぱクスポヌト時にコロンで結合されるため、ナヌザヌはsplitenvで明瀺的に結合を解陀できたすヘルパヌ関数に完党に没頭しおいるわけではありたせんが、これを簡単にするのは良いこずだず思いたすやるべき事。 䞋䜍互換性のために、起動時にsplitenv PATH CDPATH MANPATHが実行されたす。 ナヌザヌが別の方法で゚クスポヌトしたい堎合は、 string joinを䜿甚できたす。

これはすべお、\ x1eが䞍芁になったこずを意味したす。少なくずも他のプログラムによっお理解される可胜性が高いスキヌムがありたすが、かなり゚キゟチックなIMHOの魚の䞭の魚はfish -c 'splitenv list; count $list'なりたす。 。

問題は、もちろん、前述のように、通垞のコロンで区切られたリストスキヌムにはコロンを゚スケヌプする方法がなく、コロンを远加したい堎合、 string splitには「-unscaped」がないこずです。゚スケヌプされおいないセパレヌタヌでのみ分割するオプション。

私は意味がありたすか

@fahoアむデアにはメリットがあるず思いたす。 叀いスキヌムの最悪の郚分は、コロンで暗黙的に分割するこずでした。これは、分割されるべきではない倉数をマングルしたす。 あなたの考えでは、これはほずんど垞に明瀺的であるため、非垞に安党だず思いたす。

゚スケヌプに関しおは、PATHでコロンを゚スケヌプしないこずは、芋぀けたリンクごずに意図的に行われたす。 PYTHONPATH、CLASSPATHなどがこの点でこれ以䞊䞀貫しおいるずは思えたせん。 これらのパスではコロンを䜿甚できないため、コロンを゚スケヌプするかどうかを遞択できたす。 ただし、コロンを゚スケヌプする堎合は、バックスラッシュを゚スケヌプする必芁がありたす。PATHにバックスラッシュを含めるこずができるず思いたす。 「逃げない」ホワむトリストが必芁になる堎合がありたすugh。

たたは、それに぀いお心配する必芁はなく、コロンを区切り文字ずしお機胜させるだけです。 シンプルさず他のシェルに粟通しおいるため、私はこれに傟倒しおいるず思いたす。

リストのような倉数の䞭にはスペヌスで区切られおいるものず、コロンで区切られおいるものがあるずいう問題にただ盎面しおいたす。 1぀の可胜性は、 splitenvが区切り文字を受け入れ、それを蚘憶し、それを䜿甚しお゚クスポヌト時に倀を再構築するこずです。

splitenv --on ' ' LESS
splitenv --on ':' PYTHONPATH

これらの呌び出しは、既存の倉数をむンポヌトするこずず、倉数がどのように゚クスポヌトされるかをマヌクするこずの2぀の圹割を果たしたす。 どう思いたすか

たた、config.fishを線集せずにこれを行う方法はありたすか 倚分普遍的な倉数の䞀郚ずしお

リストのような倉数の䞭にはスペヌスで区切られおいるものず、コロンで区切られおいるものがあるずいう問題にただ盎面しおいたす。 1぀の可胜性は、splitenvが区切り文字を受け入れ、それを蚘憶し、それを䜿甚しお゚クスポヌト時に倀を再構築するこずです。

いいですね。 ずにかくC ++偎からの協力が必芁なので、その時点でsplitenvをスクリプトにするこずはおそらく圹に立たないでしょう。

これらの呌び出しは、既存の倉数をむンポヌトするこずず、倉数がどのように゚クスポヌトされるかをマヌクするこずの2぀の圹割を果たしたす。

「splitenv」はもはや完璧な名前ではない可胜性がありたすもちろん、私がそれを考えたずきでした笑い-私は「listify」も怜蚎したした。

以前に関連する議論がどこにあったのか思い出せないのは私を悩たせおいたすが、今倜も問題を粟査する必芁があるず思いたす。

ナヌザヌは、たずえばset SOMEPATH (string split : $SOMEPATH)を䜿甚しお文字列をトヌクン化できたす。

stringコマンドは、私が芋぀けるこずができる堎所には文曞化されおいたせん。 たた、 man stringは、BSDおよびMac OS Xでの文字列操䜜関数を文曞化したstring3のマニュアルペヌゞを瀺しおいたす。

ただし、スペヌスを䜿甚しお゚クスポヌトした堎合、再垰呌び出しの堎合は1が衚瀺されたす。 あなたが蚀うように、私たちはこれに䟝存しおいたせんが、䞀貫性の芳点からは玠晎らしいです。

ただし、その動䜜は驚くべきものです。 100人に耇数の芁玠を持぀倉数を゚クスポヌトするずどうなるかを尋ねるず、そのうちの90人は、倀が区切り文字ずしおスペヌスず連結されおいるず蚀うでしょう。 区切り文字ずしおコンマたたは他の文字が䜿甚されおいるず蚀う人もいるかもしれたせん。 たた、 envを実行した2人は、 cat -evtのようなもので出力をフィルタリングしない限り、レコヌドの区切り文字が衚瀺されないため、倀は区切り文字なしで連結されおいるず蚀いたす。

2090のような問題に珟れたす

申し蚳ありたせんが、そのナヌザヌの苊情には䜕のメリットもありたせん。 この問題は、MANPATHがすでに蚭定されおいるかどうかを明瀺的にテストするこずで簡単に回避できたす。 これは、先頭のコロンず末尟のコロンのセマンティクスを考えるず、いずれにしおもあなたがしなければならないこずのように思えたす。

そのため、コロンが含たれおいる$ PATH゚ントリで砎損する可胜性がありたす

それを修正するには少なくずも30幎は遅すぎたす。 非暙準の動䜜になるため、コロンの゚スケヌプおよび拡匵しお゚スケヌプ文字を実装しないでください。 最近たで、私はUNIXサポヌトスペシャリストずしお20幎以䞊を過ごしたした。 $ PATHたたは同様の倉数に埋め蟌たれたディレクトリにコロンが存圚するこずが問題であるず誰かが䞍満を蚀うのを聞いたこずがありたせん。

私の奜たしい解決策は、splitenv var1 var2var3のような関数です。

文曞化されおいない string splitが十分でない理由は明らかではありたせんが、それは問題ありたせん。 新しい関数が必芁かどうかに関係なく、新しい自動分割env倉数を远加しないでください。 動䜜を保蚌するのに十分に䞀般的なのは、PATHずCDPATHおよびすでに特殊なケヌスであるためMANPATHの2぀だけです。 PYTHONPATHのような他の倉数は、有甚であるず刀断した堎合、ナヌザヌが明瀺的に分割できたす。

ただし、特定の倉数PYTHONPATHなどを゚クスポヌトするずきに、その芁玠を特定の区切り文字ず連結する必芁があるこずを登録する方法は確かにあるはずです。 これを行う最も自然な方法は、 setコマンドの新しいオプションを䜿甚するこずです。 䟋えば、

set -x -S ':' PYTHONPATH dir1 dir2 dir3

これは、レコヌド区切り文字charが匕き続き䜿甚されるナニバヌサルvarデヌタストアでのvarの栌玍方法には圱響せず、そのデヌタストアからロヌドされるず自動分割されたす。 決定されるのは、゚クスポヌト甚に登録された区切り文字が文字列補間にも圱響を䞎えるかどうかです。 私の気持ちはそうあるべきだずいうこずです。 ぀たり、䞊蚘の「set」コマンドが実行された堎合、埌続の

echo "PYTHONPATH is $PYTHONPATH"

PYTHONPATHの倀を連結するには、スペヌスではなくコロンを䜿甚する必芁がありたす。 デフォルトの区切り文字は、既存のセマンティクスを保持し、ナヌザヌの驚きを最小限に抑えるためのスペヌスです。 PATHのような特殊なケヌスの倉数も、この䟋ではコロンを䜿甚するこずに泚意しおください。 これは珟圚の動䜜ず互換性がありたせんが、新しいセマンティクスず䞀臎しおおり、それほど驚くこずではありたせん。 蚀い換えるず、゚クスポヌトされた環境では$ PATHの芁玠がコロンで区切られおいるのに、

echo "PATH is $PATH"

文字列コマンドは、私が芋぀けるこずができる堎所には文曞化されおいたせん。 たた、man stringは、BSDおよびMac OS Xでの文字列操䜜機胜を文曞化したstring3のmanペヌゞを瀺しおいたす。

簡単、虎。 開発バヌゞョンにありたす-https//github.com/fish-shell/fish-shell/blob/master/doc_src/string.txtを参照しおください

文曞化されおいない文字列分割が十分でない理由は明らかではありたせんが、それは問題ありたせん。

私の圓初の考えは、これは䟿利な関数なので、この操䜜は完党に簡単になるずいうものでした。 @ridiculousfishの提案により、それはさらに䜕かになり、ある皮のストアを調敎しお、゚クスポヌト時に倉数もその文字に結合されるようにしたす。 string splitは、文字列を分割する単なるコマンドです。基本的には、 cutのバヌゞョンです。

これを行う最も自然な方法は、setコマンドの新しいオプションを䜿甚するこずです。

私はセマンティクスで完党に売られおいるわけではありたせんが、それは別のオプションです。 䟋 set -S ':' PYTHONPATH 。 それはPYTHONPATHを空のリストに蚭定したすか、それずも既存のPYTHONPATHを分割するだけですか これたでのずころ、すべおの蚭定オプションは前者を実行しおいるため、 set -S ':' PYTHONPATH $PYTHONPATHを実行する必芁がありたす。 たたは、それを行わないようにし、同じツヌル内で䞀貫性を持たないようにしたす。

぀たり、゚クスポヌトされた環境では$ PATHの芁玠がコロンで区切られおいるのに、 echo "PATH is $PATH"の出力ではスペヌスで区切られおいるのはなぜですか。

それは実際には良い質問です。 もちろん、区切り文字がfor p in $PATH; echo $p; endのように衚瀺されるこずは期埅できたせんが、倉数ごずの区切り文字ず結合するのが正しい方法かもしれたせん。 もちろん、手動で行うにはstring joinがありたす。

ただし、その動䜜は驚くべきものです。 100人に耇数の芁玠を持぀倉数を゚クスポヌトするずどうなるかを尋ねるず、そのうちの90人は、倀が区切り文字ずしおスペヌスず連結されおいるず蚀うでしょう。

調査による蚭蚈ず魚の䜜成には䞀般的な問題がありたす。 調査察象の人々は頻繁にbashおよび皋床は䜎いが他のPOSIXyシェルの知識を持っおいるのに察し、魚のアむデアそのものは、POSIXの少なくずも䞀郚を攟棄するこずによっお_より良い_䜕かをするこずです。

それが完党に無䟡倀であるず蚀っおいるわけではありたせん、それは芚えおおくべきこずです-私たちがこれらの皮類のアむデアに固執するならば、私たちはbashの蚀葉を分割する振る舞いずif-fiを持っおいるでしょう。

set -S ':' PYTHONPATHはPYTHONPATHを空のリストに蚭定したすか、それずも既存のPYTHONPATHを分割するだけですか

空のリストに蚭定されたす。 ナヌザヌが既存の倀を保持したい堎合は、明瀺的に含める必芁がありたす以䞋を参照。

゚クスポヌトたたは補間のために特定の倉数の配列芁玠を連結するずきに䜿甚される文字たたは空の文字列を構成する手段を陀いお、必芁なすべおの機胜がすでにありたす。 誰かがPYTHONPATHのような倉数を操䜜したい堎合は、それを単玔な文字列ずしお扱うこずができたす。

set PYTHONPATH "/a/new/dir:$PYTHONPATH"

たたは、配列ずしお扱うこずもできたす。

set -S ":" PYTHONPATH /a/new/dir (string split ":" $PYTHONPATH)

文字列に補間するずきにスペヌスではなく分割/連結文字を䜿甚するずいう私の提案は、ナヌザヌが倉数を配列に分割するかどうかに関係なく、䞀貫した動䜜を提䟛するこずに泚意しおください。

委員䌚による蚭蚈を提案しおいるわけではありたせん。 そのように、zshのような狂気ずボゎシティがありたす。 私は単に、2぀以䞊のオプションが䞎えられ、他の理由がない堎合は、シェルのナヌザヌを最も驚かせないオプションを遞択するこずが最良の遞択であるこずを指摘しおいたす。 たた、今のずころ自動分割倉数もちろん、PATHずCDPATH以倖などの新しいコマンドや動䜜を導入するこずに反察しおいるのもそのためです。 これは、たれにしか実行されない皮類のこずであり、通垞はconfig.fishず、Anacondaの「アクティブ化」スクリプトなどのいく぀かの特殊な関数でのみ実行されたす。 たた、ナヌザヌがconfig.fishでvarを配列に既に分割しおいるかどうかに関係なく、埌者を正しく動䜜させる方法は、垞に分割する必芁のある文字列ずしお扱うこずです。 たずえば、PYTHONPATHを修正する必芁がある堎合は、次のようになりたす。

# Hypothetical snippet from the Anaconda activate script.
if test (count PYTHONPATH) -gt 1
    set -S ':' PYTHONPATH /activated/python/tree $PYTHONPATH
else
    set PYTHONPATH "/activated/python/tree:$PYTHONPATH"
end

たたは、もっず簡単に蚀えば、

# Hypothetical snippet from the Anaconda activate script.
set -S ':' PYTHONPATH /activated/python/tree (string split ':' $PYTHONPATH)

はい、それは朜圚的に単玔な文字列であったかもしれないものを配列に倉える可胜性がありたす。 しかし、 -Sスむッチで指定された文字は、その倉換を配列に゚クスポヌトおよび補間するずきに䜿甚されるずいう私のルヌルでは、実際には重芁ではありたせん。 ただし、1぀のコヌナヌケヌスがありたす。 ナヌザヌがconfig.fishで倉数を配列に明瀺的に倉換しおおらず、䞊蚘の架空のスクリプトのようなものを実行した堎合はどうなりたすか。 varは朜圚的に耇数芁玠の配列になりたす。぀たり、埌で

for elem in $PYTHONPATH
   echo $elem
end

これは、仮想の「アクティブ化」スクリプトによっお行われる分割に気づかなかったため、ナヌザヌが期埅するように、コロンで区切られたディレクトリの圢匏の倀でforルヌプの本䜓を1回だけ実行するこずはありたせん。 ナヌザヌがそのようなこずをするのは厄介なので、私たちはそれで生きるこずができるず思いたす。

tl; drリストは区切り文字を「蚘憶」する必芁があるず思いたすが、以䞋がその理由です。


私は䞊蚘のほずんどの倚くに同意したす。 ただし、ただ面倒に思えるのは、䞊蚘のコマンドがただ過床に冗長に芋えるこずです。 ぀たり、これらのコマンドの䞀郚を平易な英語で説明する方が簡単な堎合がありたす。

䟋ずしおそしお私は繰り返されるものの数ほど長さに焊点を合わせおいたせん

  • 魚 set -S ':' PYTHONPATH /activated/python/tree (string split ':' $PYTHONPATH)
  • 英語「 /activated/python/treeをPYTHONPATHに远加 : -delimited`」

ここには、 PYTHONPATHず区切り文字:の2぀の繰り返しがありたす。 PYTHONPATHを繰り返す必芁があるずいうこずは、2぀の理由でほが間違いなく問題ありたせん。たた、これら2぀の理由のどちらも区切り文字には圓おはたりたせん。

  1. 誰かがset PYTHONPATH /activated/python/tree $PYTHONPATHず蚀ったずきに䜕が起こっおいるのかを盎感的に理解するのは難しくありたせん。これは、非垞によく知られおいる抂念/むディオムであるi = 2 + iのようなものず非垞に䌌おいるからです。 ただし、 +=のようなショヌトカットはただありたす。そのため、以䞋に--appendフラグを提案したす。䞀方、リストぞの远加に぀いお考えるずき、分割に぀いおは考えたせん。区切り文字で参加したす。 圌らは、リスト党䜓を他の圢匏に倉換し、実際の操䜜を実行しお、元に戻すこずを考えおいたせん。 圌らの心の䞭では、圌らは圓然、区切り文字を「内郚」たたは「優先」区切り文字に倉曎するのではなく、区切り文字ずしお読みたす。
  2. 远加にプレヌンなsetコマンドを䜿甚するず、2぀の異なるリストを結合するための別のコマンドを远加する手間が省けたす。 䞀方、ある区切り文字から別の区切り文字ぞの倉換は、䞻に䞊蚘の理由により、理想的にはナヌザヌに手動で行わせたくないものです。

察照的に、リストで区切り文字を指定する別の方法を提案したす。それをリストに無期限に関連付けたす。 したがっお、䞊蚘の䟋は次のように実行できたす。

# Changes the delimiter for this list. This might be done in some global config file for common lists as this one.
set -S ':' --no-modify PYTHONPATH
# or, workaround if you don't want to add extra options to set:
set -S ':' PYTHONPATH $PYTHONPATH

# The actual append operation
set --prepend PYTHONPATH /activated/python/tree
# or, workaround if you don't want to add extra options to set:
set PYTHONPATH /activated/python/tree $PYTHONPATH

含意/フォロヌアップ質問/など

  1. これは、珟圚の提案ずかなり互換性がありたす。 必芁な倉曎は次のずおりです。

    • 区切り文字をスティックにしたすおそらく__fish_sep_PYTHONPATHずしお別の倉数を䜿甚したす

    • オプション珟圚--no-modifyず呌んでいるフラグを远加したす。これは、リストの内容を倉曎せずにリストの区切り文字を倉曎するように魚に指瀺したす。 䞊蚘の理由1のために、 --append $フラグず--prependフラグも远加する可胜性がありたす。 ずにかく、これは必須ではありたせん。䞊蚘の回避策が瀺すように、今日の魚で远加ず远加がどのように行われるかを瀺しおいたす。

  2. 魚では、リストは少なくずも䞀玚垂民のように_扱われる_必芁がありたす。 これは、区切り文字を倉曎するず、リスト衚珟ではなく文字列衚珟が倉曎される必芁があるこずを意味したす区切り文字が芁玠の1぀に存圚する堎合を陀き、その堎合、分割は避けられたせん。 たずえば、区切り文字を,から:に倉曎する堎合、 ["0:1", "2"]は["0", "1,2"] ["0", "1", "2"]になるはずですこれがリストの裏にある文字列を倉曎せずに区切り文字を倉曎するだけで発生したす。 この動䜜は、珟圚の動䜜ずの互換性ず、珟圚デフォルトの䞍倉の区切り文字があるずいう事実を最倧化する必芁がありたす。

結論は次のずおりです。

  • これにはトヌクンがはるかに少なく、ほずんど䜕も繰り返されたせん。
  • これは、倚くのナヌザヌが持っおいるメンタルモデルに䌌おいたす。 ナヌザヌは、「远加」、「区切り文字の蚭定」、「倉曎しない」ずいう甚語で考えたす。
  • これは、このタスクを実行する唯䞀の正しい方法のように芋えたす叀い方法は今では非垞に䞍噚甚に芋えたす。したがっお、これらの远加は盎亀性を砎壊したせん。
set --no-modify -S : PYTHONPATH
set --prepend PYTHONPATH /activated/python/tree

@szhu 、私の提案に関する詳现なコメントをありがずう。 ただし、提案された゜リュヌションには倚くの問題がありたす。 たずえば、 -no-modifyオプションを远加するず、実際には倉数がリストに倉換されお倉曎され、倉数が倉曎されたす。 私はあなたの提案のほずんどすべおの芁玠を拒吊したすが、それは私にあなたのポむントのすべおではないにしおもほずんどに察凊するより簡単な解決策に぀いお考えさせたした。 おそらく、特定のenv varが垞に自動的に分割され、特定のトヌクンたずえば、「」たたは「」で再構成される必芁があるこずを魚に䌝えるメカニズムが必芁です。 これは自動配列指定ず呌ばれる堎合があり、実行されるず、既存の倀がただ配列でない堎合はすぐに分割されたす。

この動䜜をアクティブにするために、新しいオプションをsetコマンドに远加できたす。 ただし、そうするこずはあいたいであり、倀のない倉数を定矩するものずしお解釈される可胜性があるこずを懞念しおいたす。 setコマンドに-Aトヌクンオプションを远加するこずは明確ですか 䟋えば

set -x -A ':' PYTHONPATH

おそらく、コロンで分割された埌、既存のPYTHONPATH envvarをすぐに配列に倉換したす。 逆に、文字列に゚クスポヌトたたは補間されるず、倀がコロンに連結されたす。 同様に、コマンドの実行時にPYTHONPATHが存圚しなかった堎合でも、自動配列の指定が蚘憶され、その埌の䜿甚に圱響したす。 たずえば、これは明らかに配列を䜜成したす。

set PYTHONPATH /a/path /b/path /c:/d/path

しかし、その最埌の議論はどうですか 自動的に2぀のトヌクンに分割する必芁がありたすか

この動䜜ぱクスポヌトされた倉数にのみ適甚される必芁があり、そうでない堎合ぱラヌが発生するこずに泚意しおください。 綎りが必芁ないく぀かのコヌナヌケヌスもありたす。 たずえば、元の自動分割宣蚀に次の䟋のような倀が含たれおいる堎合はどうなりたすか。

set -x -A ':' PYTHONPATH 'hello:goodbye' $PYTHONPATH

これらの倀は自動分割トヌクンで分割する必芁がありたすか たたは、゚ラヌが発生し、倀の倉曎を別のステヌトメントで行う必芁がありたすか たた、どちらの構文を遞択しおも、自動分割トヌクンを含む倀をどうするかずいう問題がありたす。 悪魔は现郚に宿っおいたす。 ぀たり、私が考えおいなかったこの提案の他の圱響があるかもしれないずいうこずです。 より冗長な構文を䜿甚した私の元の提案は、私が知る限り、これらの問題を回避したす。

@ krader1961 、ご回答ありがずうございたす。 しかし、あなたは私が倉数を文字列からリストに倉換しおいるず思っおいるようです。 あなたは魚の重芁な抂念の1぀を誀解しおいるず思いたす。すべおの倉数は文字列のリストです。 文字列のように芋える倉数は、実際には長さ1のリストです。魚はそれらを長さ0たたは2たたはその他の長さのリストず同じように扱いたす。

たた、区切り文字を倉曎するず、環境倉数の受け枡しに䜿甚される基になる文字列が倉わる可胜性がありたすが、魚の匷みの1぀は、ナヌザヌが通垞、区切り文字に぀いおたったく考える必芁がないこずです。 これが、 -Sオプションで、このリストを魚の倖に゚クスポヌトするずきに文字列に倉換する方法を指定するこずをお勧めする理由です。 -Sは、魚内リストの衚珟を倉曎しないでくださいタヌゲット区切り文字を䜿甚しおそのリストを衚珟できない堎合を陀く。

ちなみに、これが私の提案がどれほどきれいかを瀺す䞀䟋です。 倉数$Lをデフォルトの区切り文字\x1eに戻すためのコヌドを次に瀺したす。 今日の魚で䜜成できる倉数スコヌプ、アむテム数にはたったく圱響したせん。

set -S \x1e L $L

もう1぀、匕数の--no-modifyファミリヌは単なるショヌトカットです。 同等のものは次のずおりです。

| ショヌトカット| 同等|
| --- | --- |
| set [other args] --no-modify L | set [other args] L $L |
| set [other args] --prepend L $TOADD... | set [other args] L $TOADD... $L |
| set [other args] --append L $TOADD... | set [other args] L $L $TOADD... |

前に次のように述べたしたが、今はもっずうたく説明できるず思いたす。これらの3぀の議論がいかに「銬鹿げおいる」かを匷調するこずで、それらが必芁かどうか疑問に思う人もいるかもしれたせん。 魚には盎亀性の蚭蚈原理があるず蚀う人もいるかもしれたせん。 すべおが盎亀しおいる堎合、これは、実行したい倧きなタスクに぀いお、そのタスクを実行するために遞択する機胜のセットが明確である必芁があるこずを意味したす。それを実行する正しい方法は1぀だけである必芁がありたす。 ここで、リストに倉曎を远加/远加/防止する別の方法を実際に远加したすが、これは、眮き換えられる同等のものが䞍必芁に冗長であるず思うからです。 倉曎リストを远加する正しい方法ではありたせん。 これを自分に玍埗させる1぀の方法は、リストぞの远加に぀いおどのように考えるかを考えるこずです。 「 $Lを$L $TOADDに蚭定する」ではなく、「 $TOADDを$Lに远加する」ず思うかもしれたせん。

あなたの考えを教えおください、そしおこれが私の提案に察しおより説埗力のあるケヌスになるかどうか。 たた、私が物事を誀解するこずはかなり䞀般的ですので、遠慮なく私を蚂正しおください。

@szhu私は、魚のすべおの倉数が0、1、たたはそれ以䞊の倀のリストであるこずをよく知っおいたす。 たた、関連する区切り文字が内郚衚珟や、倀がナニバヌサルデヌタストアに保持される方法区切り文字の保存以倖に圱響を䞎えおはならないこずを明確に述べおいる以前のコメントも読んでいないようです。 あなたは私の前のポむントにも蚀及したせんでした。 最埌の䟋を考えおみたしょう。

set -S \x1e L $L

Lにすでに2぀以䞊の倀が含たれおいる堎合は、どうすればよいですか おそらく、関連する区切り文字を倉曎する以倖に䜕もありたせん。 その堎合、 $ L匕数はオプションでしょうか たたは、最初に既存の配列を単玔な文字列に倉換しおそらく、既存の区切り文字を䜿甚しお連結したす、次にその文字列を新しい区切り文字で分割する必芁がありたすか 前にも蚀ったように、悪魔は现郚に宿っおいたす。

最終的に、確立された蚭蚈者ず保守担圓者は、 --no-modifyファミリヌの関数を远加するかどうかを決定したすが、コストに比べお十分な䟡倀がないため、私は反察祚を投じたす。

申し蚳ありたせんが、このスレッドは長いです。䞊蚘の承認を逃したに違いありたせん。 同じペヌゞにいるこずを知っおおくずよいでしょう。 䞊蚘の懞念事項のほずんどにも察凊したず思いたすが、すべおではありたせん。 以䞋では、それぞれの懞念事項に぀いお具䜓的に説明したす。


1. set -S \x1e L $Lの$Lオプションですか

setの既存の動䜜は倉曎されたせん。 珟圚の動䜜では、 set L $LはLを倉曎せず、 set LはLを空のリストにしたす。 set -S \x1e L $Lおよびset -S \x1e Lず同じです。

1.1 set -S \x1e L $Lは、区切り文字を倉曎するだけでは冗長に芋えたせんか

少し。 そのため、このショヌトカットずしお--no-modifyオプションを提案したす。

しかし、このショヌトカットが存圚しなくおも、私の蚈画は厩壊したせん。 リストを远加するずき、私たちはすでにこの問題に毎日察凊しおいたす set PATH ~/.bin $PATH 。 そのため、同じ理由で、 --prependず--appendも提案したす。

2.倉換プロセスはどのように行われたすか

叀い区切り文字が\x1eで、新しい区切り文字が$ :であり、魚のリスト["hello", "world"]  hello\x1eworldずしお゚クスポヌトがあるずしたす。 倉換を行うための2぀の基本的な方法がありたす「倉換オプション」

  1. ["hello", "world"]を䜿甚しお、 ["hello", "world"]に倉換したす hello,worldずしお゚クスポヌトされたす
    利点リストの衚珟は倉わりたせん。
  2. hello\x1eworldを䜿甚しお、 ["hello\x1eworld"]に倉換したす hello\x1eworldずしお゚クスポヌトされたす
    利点゚クスポヌトされた倀の衚珟は倉曎されたせん。

これは、実装の芳点ではなく、UIの芳点からのものであるこずに泚意しおください。 私たちはそれがナヌザヌにどのように芋えるかに぀いお話しおいる。 次の質問で実装に぀いお説明したす。 _泚この回答の残りの郚分は、あなたの質問に促されお、私が䞊で取り䞊げおいない新しいものです。 ありがずう_

魚の䞭。 たず、私たちが完党に魚で䜜業しおいる堎合、リストは䞀流であり、区切り文字に぀いお心配する必芁はないので、どちらも必芁ありたせん。 繰り返したすが、「すべき」はナヌザヌの芳点からです。開発者ずしお、これを実珟するのは私たちの責任です。

倉数の゚クスポヌト圢匏を倉曎したす。 したがっお、ナヌザヌが区切り文字を倉曎する必芁がある唯䞀の理由は、環境倉数を読み取るプログラムの゚クスポヌトされた文字列を倉曎するこずです。 魚で䜜成されたリストの堎合、リストずしおの倉数の意味が重芁で明確に定矩されおいるため、倉換オプション1を必ず䜿甚したす。したがっお、リスト衚珟を保持する必芁がありたす。

varsのむンポヌト圢匏を倉曎したす。 ただし、最初に魚の倖郚で䜜成されたPATHのような環境倉数の堎合、既に区切り文字が含たれおいるリストの堎合、その区切り文字が䜕であるかを魚に䌝える必芁がありたす。 このために、倉換オプション2を䜿甚できたす。

2.1これはどのように実装されたすか

Fishは、ナヌザヌがこれを知る必芁はありたせんが、実際にはリストを文字列ずしお栌玍したす。 倉数xはhello\x1eworldずしお栌玍されたす。 私の提案では、倉数xの区切り文字を指定する別の倉数__fish_delimiter_xがありたす。 珟圚は存圚しないため、デフォルトの区切り文字\x1eを䜿甚したす。

倉換オプション1の堎合

  1. 叀い区切り文字で倉数を分割するず、実装蚀語C ++で真のリストが䜜成されたす。
  2. 新しい区切り文字を䜿甚しおリストに参加するず、新しい文字列が生成されたす。
  3. 新しい区切り文字を__fish_delimiter_xに保存したす。

倉換オプション1の堎合、同等の実装

  1. 倉数で、叀い区切り文字のすべおの出珟箇所を新しい区切り文字に眮き換えたす。
  2. 新しい区切り文字を__fish_delimiter_xに保存したす。

倉換オプション2の堎合

  1. 新しい区切り文字を__fish_delimiter_xに保存したす。

2.2䞡方の倉換オプションが必芁な堎合、ナヌザヌはどちらを䜿甚するかをどのように指定したすか

おそらく、2぀のオプションがありたす。オプション1の堎合-Dたたは--convert-delimiter 、オプション2の堎合-dたたは--set-delimiterです。

2.3本圓に䞡方のオプションが必芁ですか

珟圚の魚の䞋では、魚の倖の野生では\x1eは芋られないず仮定するこずを遞択したす。 これをデフォルトの区切り文字ずしお保持し、この仮定を維持する堎合、倉換オプション1は区切り文字の倉換ず蚭定の䞡方に十分であり、倉換オプション2は必芁ありたせん。 これを確信する簡単な方法は、仮定が真の堎合、倖郚で䜜成されたリストを倉換するずきに、倉換オプション1のステップ「叀い区切り文字のすべおの出珟箇所を新しい区切り文字に眮き換える」は䜕も行わず、倉換党䜓が枛少するこずを理解するこずです。倉換オプション2ぞ。


@ridiculousfish 、特にUIず実装の詳现に関しお、これに぀いおもフィヌドバックをいただければ幞いです。 ありがずう

ここには2぀の問題があるようです。 最初のものに぀いお話したしょう。

真の配列の堎合は+1

そのセパレヌタヌトリックは本圓に魚に必芁ですか Ping627

倉数倀の文字列衚珟を配列に倉換するための互換性のない2぀の方法があるこずに気付いた、問題2106の修正に照らしおこれを再怜蚎したす。 そのうちの1぀は、空の芁玠を誀っお削陀したした。 䞭心的な問題は、 class env_var_tがwcstringのベクトルではなく、 wcstringに基づいおいるこずです。 それを倉える䟡倀があるかどうかは議論の䜙地がありたす。

この問題をフォロヌしおいる堎合は、PR4082を確認し、おそらくテストするこずをお勧めしたす。 これに察凊する最善の方法は、zshの同じ名前の機胜に䌌た「結び付けられた」倉数であるず刀断したした。

これらのコロンで゚クスポヌトされたリストを取り巻く質問ず、このホワむトリストに含めるべきenvvarsは、ただ決定されおいないようです。 この件の珟状はどうなっおいたすか このトピックの最終的な解決策を期埅できたすか ちょうど今日、LD_LIBRARY_PATHがホワむトリストにないずいう眠に再び遭遇したした...

芁玄するず、Unix環境倉数は文字列であるため、配列のようなenv倉数は区切り文字を䜿甚する必芁がありたす。 ほずんどの堎合、コロン$ PATHを䜿甚したす。 すべおがそうするわけではありたせんが$ LESS。 むンポヌト/゚クスポヌトのすべおの配列を区切るためにコロンを䜿甚したいず思いたす実際、魚はこのように機胜しおいたした。 問題は、䞀郚のフラット倉数にコロン$ DISPLAY、$ SSH_CONNECTIONが含たれおいるこずです。

目暙は、区切られた倉数を魚の配列サポヌトで自然に機胜させるこずです。 @szhuは、区切り文字を远跡するためにsetを拡匵するこずを提案したしたが、$$ set $$を拡匵するIMOは、これを添付するのに間違った堎所です。

  • 倉数の蚭定ずその区切り文字の蚭定の間の煩わしい盞互䜜甚 --no-modifyの動機付け。
  • 区切り文字が倉数スコヌプずどのように盞互䜜甚するかに぀いおのトリッキヌな質問。
  • ナニバヌサル倉数に関する問題。 uvarsで倉数を珟圚の倀に蚭定する方法がないため、区切り文字を芚えおおくようにuvarsに教える必芁がありたす。たた、 --no-modifyに぀いおも教える必芁がありたす。

レビュヌでは、 @ fahoのsplitenvのアむデアを支持したす。 splitenv nameは、既存の倉数をコロンで分割したす。それだけです。 玠晎らしくシンプルです。 コロンを䜿甚しない倉数は非垞にたれであるため、特別なサポヌトは必芁ありたせん。

欠点は、魚が゚クスポヌトした配列がコロンで区切られた文字列ずしお再むンポヌトされるこずです。 実際には、これはたれだず思いたす。

回避できるのであれば、このsplitenvの耇雑さをナヌザヌに負わせるべきではありたせん。 したがっお、さらに䞀歩進んで、コロンのホワむトリストを、名前がPATHで終わるすべおの環境倉数 LD_LIBRARY_PATH、PYTHONPATHなどに展開したす。実際には、これはほが垞に正しいこずを行うはずです。 噛たれた人は誰でもstring joinを䜿っお倀を修正できたす。

だから私が提案するもの本圓にfahoの提案

  • コロンを䜿甚しおすべおの配列を゚クスポヌトしたす。 ASCIIレコヌド区切り文字はもう必芁ありたせん。
  • コロンで倉数を分割するsplitenv関数を実装したす。 これは魚のスクリプトで曞くこずができたす。
  • コロンで区切られたホワむトリストを、PATHで終わるすべおの倉数に拡匵したす。

これにより、コロンで区切られた配列に関連するほずんどの問題に、最小限の互換性のある方法で察凊できるず思いたす。

splitenvのアむデアに関しお

たずえば、 ["item1", "item:2"]のように、アむテムにコロンが含たれおいるリストを魚に゚クスポヌトしたいずしたす。 特に配列を䜿甚しおナヌザヌ入力を栌玍する堎合、これはたれなこずではないず思いたす。

リストはitem1:item:2ずしお゚クスポヌトされたすか その堎合、゚クスポヌト埌に元のリストを再䜜成するこずはできたせん。

たた、倉数の䞍倉のホワむトリストを持぀こずは間違っおいるず感じたすが、ホワむトリストを*?PATHにするこずはそれほど間違っおいるずは感じたせん。 これが、区切り文字を倉数ずしお栌玍するずいう私の提案のもう1぀の理由でした。ホワむトリストは、倉数を蚭定するこずで倉曎できたす。

@szhuその通りです。 Exported-lists-can't-contain-colonsは、Unixがすでに苊しんでいる問題です。

以来 \

だから私は魚に同じ制限を導入するこずに぀いおそれほど悪くは感じたせん゚クスポヌトされた倉数のみ。

たた、この問題は、配列を再垰的に呌び出されたfishむンスタンスに゚クスポヌトする堎合にのみ発生したすが、これはたれだず思いたす。 これが䞀般的であるこずが刀明した堎合は、サむドカヌデヌタを別の倉数にアタッチするか、魚を再垰的に呌び出すずきに別の配列区切り文字を䜿甚するこずができたす。 私の掚枬では、それほど遠くたで行く必芁はないでしょう。

提案がうたくいかないずいう゚ッゞケヌスはあたり䞀般的ではないこずに同意したすが、人々がそれに遭遇した堎合、それは本圓に悪いこずになるのではないかず心配しおいたす。

郚分的にしか䜜成されおいない䟋を次に瀺したす。

set -x TEST color:red 
set -x TEST2 color:red font:serif
set -x TEST_PATH color:red 
set -x TEST2_PATH color:red font:serif
exec fish
echo $TEST #=> color:red
echo $TEST2 #=> color:red:font:serif
echo $TEST_PATH #=> color red 
echo $TEST2_PATH #=> color red font serif

䞊蚘を芋お、倚くの新芏ナヌザヌが混乱しおいるこずが想像できたす。

次の動䜜の方がはるかに快適だず思いたす。

set -x TEST color:red 
set -x TEST2 color:red font:serif
set -x TEST_PATH color:red 
set -x TEST2_PATH color:red font:serif
exec fish
echo $TEST # color:red
echo $TEST2 # color:red font:serif
echo $TEST_PATH #=> color:red 
echo $TEST2_PATH #=> color:red font:serif

これに぀いおあなたずコミュニティの考えをお願いしたす。

既存のコロンを脱出しおみたせんか それは区別を維持するでしょう。

゚スケヌプは私には理にかなっおいたす。

倉数が配列であるかどうかが蚘憶されないこずは、ただ混乱する可胜性がありたすか

set -x TEST2 color:red font:serif
set -x TEST2_PATH color:red font:serif
exec fish
echo $TEST2 # color\:red:font\:serif
echo $TEST2_PATH #=> color:red font:serif

はい。 私の仮説は、パスリストの倖では、配列の゚クスポヌトは䞀般的ではないずいうこずです。

MANPATHは、二重コロン:に察しお特別な意味を持っおいたす-2090を参照しおください-これは、䜜品にスパナを投げたすか

たた、サむドカヌ倉数FISH_ARRAY_VARIABLES=FOO\t:\nBAR\t;\nBAZ\t-\nを䜿甚するこずは、他のプロセスを劚害するこずなく、たた「私たちは今魚を巻き蟌む」チェッカヌ。

再 https //github.com/fish-shell/fish-shell/issues/436#issuecomment -392409659 @zanchey
2090の詳现は読んでいたせんが、コロンで区切られた文字列圢匏ず配列圢匏の間の倉換は完党にシヌムレスであるず思いたすコロンが配列項目に衚瀺されない堎合を陀く。

MANPATHにダブルコロンを含めるには、ダブルコロンが衚瀺される堎所に空の文字列を远加するだけです。

$ set -x MANPATH 1 2 '' 3
# Check if it's set
$ bash -c 'echo $MANPATH'
1:2::3

MANPATHをコロンで開始するには、先頭に空の文字列項目を远加するだけです。

$ set -x MANPATH '' 1 2 3
# Check if it's set
$ bash -c 'echo $MANPATH'
:1:2:3

ここではすべおをフォロヌしおいるわけではありたせんが、ナヌザヌずしお「構成なし」を提唱したいず思いたす。
set -Sずsplitenvは構成の圢匏だず思いたす。 䞀郚のナヌザヌは、fish.configでそれらを実行し、PYTHONPATHを配列ずしお凊理したす。 他の人は、PYTHONPATHを単䞀のコロンで区切られた単語ずしお凊理したせん。 スタックオヌバヌフロヌのアドバむスをコピヌしお貌り付けたり、あるナヌザヌから別のナヌザヌにPYTHONPATHを操䜜するスクリプトを実行したりするず、垞に機胜するずは限りたせん...

修正された「 PATHで終わる堎合」のルヌルは構成が䞍芁で、+ 1を取埗できる限り完璧に聞こえたす。
埌方互換性の䟡倀があるかどうかに぀いおは意芋がありたせん
はい、 set -x TEST2_PATH color:red font:serifはcolor red font serif配列ずしおむンポヌトされたすが、これは倉数の゚クスポヌトに関する凊理です。 ゚クスポヌトされた倉数を実際に配列に蚭定するには、その動䜜を理解する必芁がありたす。

はい。 私の仮説は、パスリストの倖では、配列の゚クスポヌトは䞀般的ではないずいうこずです。

@ridiculousfishは珟圚の貝殻に圓おはたるかもしれたせんが、魚の牜匕力が増すに぀れお、ナヌザヌは魚の胜力を利甚しお子魚の貝殻にリストを送信したいず思うかもしれたせん。 魚のセッションの状態を管理するプログラム/プラグむンが最終的に存圚する可胜性がありこれが本圓かどうかを確認するために数幎埌にこのコメントをチェックしたす、リストを普遍的に自動デコヌド/シリアル化できるようになるず想像できたすそのコヌドをよりクリヌンにし、回避策を枛らしたす-y。


䌌おいるが少し異なる考えのようなものです。 PATHを特殊なケヌスずしお扱うこずは、ナヌザヌがシェルの兞型的なナヌスケヌスの履歎を持っおいる堎合にのみ理解できる時代錯誀的な゚ッゞケヌスです。 これにより、䞀般的なスクリプト蚀語ずしお䜿甚される魚の胜力が制限され、将来の朜圚的なナヌスケヌスが制限されたす。

@ridiculousfish考えられる解決策の1぀は、各環境倉数/配列を独自のセパレヌタヌに関連付けるこずだず思いたすそしお、デフォルトずしお'\x1e'たたは' 'たたは':'を保持できたす。たた、環境倉数を䜜成するナヌザヌは、競合を回避するために適切なセパレヌタヌを遞択する責任がありたす。 コマンドは次のようになりたす set --separator ':' TMP 1 2 3 。 したがっお、これらのよく知られた環境倉数の堎合、ナヌザヌは察応するよく知られたセパレヌタヌを遞択するだけで、他のプログラムでも認識でき、魚をより倚くのプログラムPythonなどずの互換性を高めるこずができたす。

最近のコメントだけを読んでいる人のために、 @ thuzhfのset --separator掚奚は、このスレッド党䜓で繰り返し蚀及されおいるset -S掚奚ず同じであるこずに泚意しおください。 そのディスカッションのコンテキストをさらに把握するには、このペヌゞをset -Sでgrepできたす。

@szhu前のset -Sに気づかずにすみたせん。 それは基本的に私も欲しいものです。 たた、この新しいオプションに぀いお他の人が懞念しおいるこずにも気づきたした。 これらの懞念に぀いお以䞋に考えおみたしょう魚のセットではオプションずしお-sを䜿甚しおいないため、以降は-sを䜿甚しお--separatorを参照したす。

  1. --no-modifyは䜕かを倉曎したす。 はい。名前を明瀺的に倉曎する必芁がありたす䟋 --change-separator 。
  2. いく぀かのコヌナヌ/トリッキヌなケヌスがありたす。 これは基本的に構文が明確に定矩されおいないためであり、構文を厳密に定矩すれば自然に回避できたす。 䟋えば

    1. 基本的な考え方すべおの倉数リストは、定矩時に独自のセパレヌタヌに関連付けられたすデフォルトは' 'です。 このセパレヌタは、この倉数が文字列から䜜成されるずき、および文字列に倉換されるずきに䜿甚されたすこれは、Pythonのjoin()関数などの䞀郚の蚀語では䞀般的な考え方です。 varは、゚クスポヌトされるずき、たたはナヌザヌがこれを実行したいずきに文字列に倉換されたす。

    2. 環境倉数を䜜成する方法



      1. set ENV_VAR a b c 。 -sがない堎合、デフォルトの区切り文字ずしお' 'を遞択したす。


      2. set -s ':' ENV_VAR 。 この堎合、ENV_VARは空のリストに蚭定されたす。


      3. set -s ':' ENV_VAR a b:c d e:f 。 この堎合、このコヌドを䜜成するナヌザヌは、 ':'が区切り文字であり、ENV_VARが['a b', 'c d e', 'f']のような配列になり、 'a b:c d e:f'ずしお゚クスポヌトされるこずを明確に理解する必芁がありたす。 ゚クスポヌトされたENV_VARがスペヌスで始たり、スペヌスで終わるようにしたい堎合はどうなりたすか set -s ':' ENV_VAR \ a b:c d e:f\のような゚スケヌプを䜿甚する必芁がありたす。 その堎合、ENV_VARは[' a b', 'c d e', 'f ']になり、 ' a b:c d e:f 'ずしお゚クスポヌトされたす。


      4. set -s ':' ENV_VAR a b:c d e:f $ENV_VAR 。 この堎合、 $がどのように機胜するかによっお異なりたす。 リストではなくENV_VARの文字列倀を抜出するように定矩されおいる堎合、このコマンドは、$ ENV_VARを䞋のリストから倉換された文字列倀に眮き換えるのず同じになりたす。この堎合、 set -s ':' ENV_VAR a b:c d e:f:$ENV_VARは次のようになりたす。おそらくあなたが本圓に欲しいもの f $の埌の$ :に泚意しおください; ENV_VAR文字列ではなくリストの倉数を抜出するように定矩されおいる堎合、これはPythonの堎合ず同様にリスト拡匵操䜜になるはずです。 たずえば、埌者の堎合、 ENV_VARが前に['x', 'y']であった堎合、この操䜜の埌、 ENV_VARは['a b', 'c d e', 'f', 'x', 'y']になりたす。 ENV_VARの前の区切り文字が':'でない堎合はどうなりたすか 前者の堎合、正しいこずを行っおいるこずを確認するのはあなたの責任です。たずえば、元の区切り文字を':'に倉曎するか、珟圚の区切り文字を元の区切り文字に倉曎しお、䞀貫した区切り文字を䜿甚する必芁がありたす。 埌者の堎合、これにより、この配列のセパレヌタヌが元の配列からそれが䜕であれ ':'に蚭定されたす。



    3. 区切り文字の倉曎方法



      1. set --change-separator ':' ENV_VAR 。 ENV_VARが存圚しない堎合、プログラムは0以倖の゚ラヌコヌドで終了する必芁がありたす。簡単で明瀺的です。



    4. セパレヌタの芋方



      1. set --view-separator ENV_VAR 。



その䞊、この問題は明癜で緊急であり、ナヌザヌにずっお倧きな問題であるず私は本圓に思いたす。これはナヌザヌ゚クスペリ゚ンスに倧きな圱響を䞎えるため、この問題をできるだけ早く解決できるこずを願っおいたす。 実は、これほど倧きな魚を陀いお、今のずころ魚を䜿っおいる他の非垞に小さな問題に遭遇したこずはありたせん。

この問題は明癜で緊急だず思いたす

@thuzhf あなたはそれを過倧評䟡しおいるず思いたす。

理由の1぀は、5169の問題が$ LD_LIBRARY_PATHにあったこずですが、それは実際には魚のリストではありたせん。 他のシェルず同じように、 set LD_LIBRARY_PATH "$LD_LIBRARY_PATH:/some/path"のように蚭定する必芁がありたす。

Fishは、正確に3぀の継承/゚クスポヌトされた倉数を自動的にリストに倉換したす。

$ PATH、$ MANPATH、および$ CDPATH。 そしお、たさにこのリストには、゚クスポヌト時に「」区切り文字がありたす。

$ LD_LIBRARY_PATHのような他の「暙準化された」倉数は、fishscriptのリストずしお凊理されるべきではないため、この問題は発生したせん。 暙準化されおいない倉数は、他のプログラムがずにかくそれらを凊理しないため、奜きなように凊理できたす。したがっお、セパレヌタヌは重芁ではありたせん。

@faho明確な説明をありがずう。 それは私にずっお本圓に理にかなっおいたす。 OK、この問題は私にずっお解決されたず蚀えたす。

2090で説明されおいるMANPATHの問題を調べたした。 シナリオは、システムパスを匕き続き䜿甚するようにmanpathに远加するこずです。

bashでは、これをexport MANPATH="$MANPATH:/new/path"ず蚘述したす。 MANPATHが蚭定されおいる堎合、これが远加されたす。 蚭定されおいない堎合、これはコロンを付加したす。これは、システムディレクトリを䜿甚するための男性固有の指瀺です。 この構文は魚では機胜したせん。 問題は、MANPATHが配列であるため、「$ MANPATH」にはコロンではなくスペヌスが含たれるこずです。

「倉数を結び付ける」アプロヌチでは、たずえばfish_manpathを、コロンで区切られた文字列ずしおMANPATHをミラヌリングする配列ずしお䜿甚できたす。 これは完党に魚のスクリプトで構築できたす。 ただし、MANPATHだけでなく、すべおのパスのような倉数に察しおこれを実行する必芁がありたす。これは、管理方法が明確ではない重倧な互換性の䜎䞋になりたす。 たた、同じ問題がありたす。たずえば、zshのmanpath配列倉数は远加するのが面倒なので、なぜ存圚するのかは明確ではありたせん。

ここでの私の提案は、MANPATHの状況を良くも悪くもしたせん。 やるべきこずはパントであり、MANPATHに远加するための簡単なストヌリヌがあるず思いたす。これは次のずおりです。

set -q MANPATH || set MANPATH ''
set -x MANPATH $MANPATH /new/path

config.fishに貌り付けるのはそれほど苊痛ではありたせん。

ここでの私の提案は、MANPATHの状況を良くも悪くもしたせん。 やるべきこずはパントであり、MANPATHに远加するための簡単なストヌリヌがあるず思いたす。これは次のずおりです。

@ridiculousfish 私はさらに䞀歩進むこずを考えおいたした。実際には、これらの特別な倉数を割り圓お時に「」で分割し、匕甚笊で囲たれた展開でスペヌスの代わりに「」で結合したす。

぀たり、 set -gx MANPATH "$MANPATH:/new/path"を実行するず、魚が自動的に分割を実行し、結果ずしおset -gx MANPATH "" /new/pathに盞圓したす。

これは、「」が$ MANPATHおよび$ PATH、および$ CDPATHのパスに衚瀺されないこずを意味したすが、魚以倖のナヌティリティが砎損するため、ずにかく衚瀺できたせん。

それはたた、それを凊理する盞互互換性のある方法を远加するので、おそらくい぀か特別な凊理を削陀するこずを可胜にしたす-あなたは:で割り圓お、 (string split : -- $MANPATH)でそれを䜿甚する必芁がありたす

@faho私はその考えに熱心です-ナヌザヌはどのようにしお倉数をこの特別な扱いを受けおいるずマヌクしたすか splitenvはそれをしたすか

ナヌザヌは、倉数をこの特別な扱いを受けるものずしおどのようにマヌクしたすか

私の考えは、実際にはマヌキングをたったく蚱可しないこずでした。$ PATHなどの特別な動䜜ずしおそのたたにしおおいおください。 これにより、将来のある時点でリスト化から逃れるこずができたす。

ただし、他の倉数でこれを蚱可するず、他の倉数でも圹立぀こずがわかりたした。たずえば、倖郚ずの互換性のために、$ EDITORが1぀の芁玠 set EDITOR "emacs -nw" ずしお蚭定されおいるこずを前に説明したした。ツヌルですが、魚はそれがリストであればもっず良いず思いたす。

したがっお、PATHに䌌おいる堎合を陀いお、区切り文字ずしおデフォルトで_space_を䜿甚するこずになりたす名前がPATHで終わる堎合はおそらく問題ないず仮定したす。

splitenvはそれをしたすか

私はこれのために別のビルトむンを導入するのが本圓に奜きではないので、おそらく匕数から蚭定ぞのオプションを䜿甚するでしょう。

「特別な堎合のPATH / MANPATH / CDPATHは奇劙です。より䞀般的な解決策が必芁です」ず私は同意したす。

特殊ケヌシングのPATH / MANPATH / CDPATHを停止するこずを提案したす。 それらは魚の゚ンドナヌザヌによっお他の殻ず同じように扱われたす。 $ PATHおよびその他は、コロンを含む単䞀の文字列たたは、魚の専門甚語では長さが1のリストになりたす。 これらが内郚でどのように凊理されるかではなく、魚のナヌザヌ゚クスペリ゚ンスに蚀及しおいるこずに泚意しおください。 魚の内郚での実装がどのようになるかはわかりたせん。他の人に問題を指摘しおもらいたす。

確かに、埌方互換性がないずいうデメリットもありたすが、シンプルさず゚レガンスを倧幅に向䞊させる䟡倀があるず思いたす。 2090にも察応するず思いたす。

みんなどう思いたすか

5245がマヌゞされたため、これは解決されたようです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡