Fish-shell: UTF-8ロケヌルは、DragonFly BSD、FreeBSD 11、12では機胜したせん

䜜成日 2016幎05月21日  Â·  60コメント  Â·  ゜ヌス: fish-shell/fish-shell

次のような行を眮くず
set LANG zh_CN.UTF-8
.config / fish /config.fishぞ
コマンドが間違っおいるず、文字を削陀できたせん。

䟋えば

cate

コマンド「cat」の「e」を削陀したい
ただし、文字を削陀するこずはできたせん
2.2.0未満で問題ありたせん。


魚バヌゞョン魚、バヌゞョン2.3.0

オペレヌティングシステムDragonFly testdf.com 4.4-RELEASE DragonFly v4.4.1.18.gc5db8-RELEASE0Thu Jan 28 15:02:10 CST 2016 [email protected] / usr / obj / usr / src / sys / lhmwzy x86_64

タヌミナルたたはタヌミナル゚ミュレヌタヌxterm

最も参考になるコメント

私はこのFreeBSDのバグを開きたした。 この壊れた実装を回避する必芁がありたす。

党おのコメント60件

どのキヌを抌しおいたすか バックスペヌス

それが圓おはたる堎合は、 bind -k backspaceを実行しお蚭定内容を確認しおから、たずえばscript たたはbashを抌しおctrl + vを抌すを実行し、キヌを抌しおどのシヌケンスを確認しおください。送信したす。 スクリプトはデフォルトで、そのセッションの出力党䜓を珟圚のディレクトリの「typescript」ず呌ばれるファむルに入れたす。 Xtermは "\ cH"を送信する必芁がありたす。これは、魚がterminfoを介しお、適切に蚭定する必芁がある_ $ TERMを介しおバックスペヌスずしお取埗する必芁がありたす。

将来の魚のバヌゞョンでは、「fish_key_reader」ず呌ばれる小さなヘルパヌプログラムを䜿甚しお、これをいくらか簡単にする予定です。

$ TERMは䜕に蚭定されおいたすか 「xterm」

キヌはBackspaceです。
私にメヌルを送っおください、そしお私はあなたに私の箱ぞのアクセスを䞎えたす、あなたに理由を芋぀けさせおください。

キヌはBackspaceです。

キヌのラベルは、送信する文字のシヌケンスを瀺しおいたせん。 gitリポゞトリから取埗した゜ヌスから魚をむンストヌルできたすか 次にmake fish_key_reader続いお./fish_key_reader堎合は、バックスペヌスキヌを抌したす。 xxdたたはod -tx1zを実行できない堎合は、バックスペヌスキヌを抌しおから[ctrl-D]を抌しおください。 たた、 bind -k backspaceを実行しお、その出力を衚瀺したす。 echo $TERMも実行したす。

責任の理由ず䞭囜語を読たないため、 set LANG zh_CN.UTF-8するのは難しいため、システムにログむンしないこずをお勧めしたす。

./fish_key_reader
999999 usec dec8 hex8 char\ b別名\ cH
参考バむンドキヌ名「backspace」のシヌケンスを芋た

bind -k backspace
bindキヌ 'backspace'のバむンディングが芋぀かりたせん

゚コヌ$ TERM
xterm

bindキヌ 'backspace'のバむンディングが芋぀かりたせん

さお、それはあなたの問題です。 それは次のようなこずを蚀うべきです

bind -k backspace backward-delete-char

これがLANG倉数の蚭定ずどのように関係しおいるのかわかりたせん。 どういうわけか、デフォルトのキヌバむンディングをオヌバヌラむドしたした。 _〜 / .config / fish / _ **ファむルで、「バむンド」ずいう単語の蚀及を怜玢したす。 たた、プラグむンマネヌゞャヌ䟋fishermanたたはoh-my-fishを䜿甚しおいたすか、たたはこの問題に関連する可胜性のある他のサヌドパヌティスクリプトをむンストヌルしたしたか

OK。
〜/ .config / fish /には3぀のファむルしかありたせん

cat config.fish
set LANG zh_CN.UTF-8
cat fishd.lhmtestdf.com 
# This file is automatically generated by the fish.
# Do NOT edit it directly, your changes will be overwritten.
SET __fish_init_1_50_0:\x1d
SET __fish_init_2_3_0:\x1d
SET fish_color_autosuggestion:555\x1eyellow
SET fish_color_command:005fd7\x1epurple
SET fish_color_comment:red
SET fish_color_cwd:green
SET fish_color_cwd_root:red
SET fish_color_end:green
SET fish_color_error:red\x1e\x2d\x2dbold
SET fish_color_escape:cyan
SET fish_color_history_current:cyan
SET fish_color_host:normal
SET fish_color_match:cyan
SET fish_color_normal:normal
SET fish_color_operator:cyan
SET fish_color_param:00afff\x1ecyan
SET fish_color_quote:brown
SET fish_color_redirection:normal
SET fish_color_search_match:\x2d\x2dbackground\x3dpurple
SET fish_color_selection:\x2d\x2dbackground\x3dpurple
SET fish_color_user:green
SET fish_color_valid_path:\x2d\x2dunderline
SET fish_greeting:Welcome\x20to\x20fish\x2c\x20the\x20friendly\x20interactive\x20shell\x0aType\x20\x1b\x5b32mhelp\x1b\x5b30m\x1b\x28B\x1b\x5bm\x20for\x20instructions\x20on\x20how\x20to\x20use\x20fish
SET fish_key_bindings:fish_default_key_bindings
SET fish_pager_color_completion:normal
SET fish_pager_color_description:555\x1eyellow
SET fish_pager_color_prefix:cyan
SET fish_pager_color_progress:cyan

魚の䞋-2.2.0
コマンドbindouput

bind
bind '' self-insert
bind \n execute
bind \ck kill-line
bind \cy yank
bind \t complete
bind \e\n commandline\ -i\ \\n
bind \e\[A up-or-search
bind \e\[B down-or-search
bind -k down down-or-search
bind -k up up-or-search
bind \e\[C forward-char
bind \e\[D backward-char
bind -k right forward-char
bind -k left backward-char
bind -k dc delete-char
bind -k backspace backward-delete-char
bind backward-delete-char
bind \e\[H beginning-of-line
bind \e\[F end-of-line
bind \e\[1\~ beginning-of-line
bind \e\[4\~ end-of-line
bind -k home beginning-of-line
bind -k end end-of-line
bind -k sdc backward-delete-char
bind \e\eOC nextd-or-forward-word
bind \e\eOD prevd-or-backward-word
bind \e\e\[C nextd-or-forward-word
bind \e\e\[D prevd-or-backward-word
bind \eO3C nextd-or-forward-word
bind \eO3D prevd-or-backward-word
bind \e\[3C nextd-or-forward-word
bind \e\[3D prevd-or-backward-word
bind \e\[1\;3C nextd-or-forward-word
bind \e\[1\;3D prevd-or-backward-word
bind \e\eOA history-token-search-backward
bind \e\eOB history-token-search-forward
bind \e\e\[A history-token-search-backward
bind \e\e\[B history-token-search-forward
bind \eO3A history-token-search-backward
bind \eO3B history-token-search-forward
bind \e\[3A history-token-search-backward
bind \e\[3B history-token-search-forward
bind \e\[1\;3A history-token-search-backward
bind \e\[1\;3B history-token-search-forward
bind \ca beginning-of-line
bind \ce end-of-line
bind \ey yank-pop
bind \cw backward-kill-path-component
bind \cp history-search-backward
bind \cn history-search-forward
bind \cf forward-char
bind \cb backward-char
bind \ct transpose-chars
bind \et transpose-words
bind \eu upcase-word
bind \ec capitalize-word
bind \ backward-kill-word
bind \eb backward-word
bind \ef forward-word
bind \e\[1\;5C forward-word
bind \e\[1\;5D backward-word
bind \e\[1\;9A history-token-search-backward
bind \e\[1\;9B history-token-search-forward
bind \e\[1\;9C forward-word
bind \e\[1\;9D backward-word
bind \e. history-token-search-backward
bind -k ppage beginning-of-history
bind -k npage end-of-history
bind \e\< beginning-of-buffer
bind \e\> end-of-buffer
bind \el __fish_list_current_token
bind \ew 'set tok (commandline -pt); if test $tok[1]; echo; whatis $tok[1]; commandline -f repaint; end'
bind \cl 'clear; commandline -f repaint'
bind \cc 'commandline ""'
bind \cu backward-kill-line
bind \ed kill-word
bind \cd delete-or-exit
bind -k f1 __fish_man_page
bind \eh __fish_man_page
bind \ep __fish_paginate
bind -k btab complete-and-search
bind \e cancel
bind \e\[I 'begin;end'
bind \e\[O 'begin;end'

しかし、fish-2.3.0では、コマンドバむンド出力

bind
bind '' self-insert
bind \n execute
bind \r execute
bind \t complete
bind \cc 'commandline ""'
bind \cd exit
bind \ce bind

どのようにfish2.3.0をむンストヌルしたしたか ナヌザヌスペヌススクリプトが芋぀からないfishバむナリを実行しおいるようです。

゜ヌスから

git clone
autoconf
configure
gmake
gmake install

さお、それは合理的に芋えたす。 次のコマンドは䜕を出力したすか。

echo $__fish_active_key_bindings
echo $fish_function_path

関数パスディレクトリの1぀通垞は最埌にリストされおいるディレクトリに_fish_default_key_bindings.fish_がありたすか functions fish_default_key_bindings䜕を出力するのか知りたいです。 その出力をコピヌしお貌り付けないでください。ただし、_fish_default_key_bindings.fish_ファむルにあるものず䞀臎する必芁がありたす。 たた、キヌバむンディングは通垞、___ fish_config_interactive.fish_スクリプトによっお蚭定されたす。このスクリプトは、関数パスvarによっおリストされたディレクトリの1぀にある必芁がありたす。

.config / fish / config.fishを削陀するず、すべおが正垞に実行されたす。
しかし、 set LANG zh_CN.UTF-8文字列を.config / fish / config.fishたたは/usr/local/etc/fish/config.fishに配眮するず、問題が発生したす。

echo $__fish_active_key_bindings䜕も出力したせん。

echo $fish_function_path出力
/home/lhm/.config/fish/functions /usr/local/etc/fish/functions /usr/local/share/fish/vendor_functions.d /usr/local/share/fish/functions

.config / fish / config.fishを削陀するか、/ usr / local / etc / fish / config.fishのすべおの行をコメント化するず、出力は次のようになりたす。

echo $__fish_active_key_bindings出力
fish_default_key_bindings

echo $fish_function_path出力
/home/lhm/.config/fish/functions /usr/local/etc/fish/functions /usr/local/share/fish/vendor_functions.d /usr/local/share/fish/functions

ファむルfish_default_key_bindings.fishは/usr/local/share/fish/functions/fish_default_key_bindings.fishにありたす

魚がキヌバむンディングを蚭定するこずは決しおないようです。

これは、 __fish_config_interactive バむンディング蚭定を含むが実行されない最初のプロンプトの盎前にある必芁がありたすか、$ fish_key_bindingsが空である倀が次の堎合はデフォルトのバむンディングに戻す必芁があるためです。有効ではありたせん。

$ LANGを蚭定するこずでトリガヌされるように芋えるため、゚ンコヌディングの問題を瀺しおいたす。

githubが゚ンコヌドを修正しようずするかどうかわからないため、すべおの構成ファむルずfishdファむルは元の圢匏で適切な堎合がありたす。 たた、config.fishで蚭定しない堎合の$ LANG倀は䜕ですか ASCII互換である必芁がありたす。そうしないず、自分のファむルを読み取るこずすらできないず思いたすが、わかりたせん

_config.fish_にset LANG zh_CN.UTF-8を远加したしたが、問題は発生したせんでした。 @fahoが蚀うように、これは文字゚ンコヌドの問題のようです。 具䜓的には、魚のファむルはUTF-8ずしお゚ンコヌドされおいたせん。 file /usr/local/share/fish/functions/__fish_config_interactive.fishは䜕を報告したすか 「ASCIIテキスト」ず衚瀺されおいる堎合は、LANG行を远加しおから、次のような新しいシェルを起動しお、デバッグ出力を収集したす。

script
fish -d5
exit
exit

次に、_typescript_ファむルをこの問題に添付したす。

file /usr/local/share/fish/functions/__fish_config_interactive.fish
/usr/local/share/fish/functions/__fish_config_interactive.fish: ASCII text

cat typescript output:
Script started on Mon May 23 07:34:02 2016
@ ~/home/lhm> /usr/local/bin/fish -d5
@ ~/home/lhm> exit

@ ~/home/lhm> exit

なんおこったい fish -d5はシェルプロンプト以倖の出力を生成しなかったず蚀っおいたすか 次のような倧量の出力が埗られるはずです。

fish: Continue job 1, gid 0 (fish_title), COMPLETED, NON-INTERACTIVE
fish: proc::read_try('fish_title')
fish: io_buffer_t::read: blocking read on fd 3

DragonFlyはhttps://www.dragonflybsd.org/ぞのset LANG Cたたはset LANG en_US.UTF-8を䜿甚するずどうなりたすか。

はい、 https//www.dragonflybsd.org/はプロゞェクトのホヌムペヌゞです。
私は次のようなgit゜ヌスからビルドしたす

git clone
autoconf
configure
gmake
gmake install

set LANG Cのみがfish -d5動䜜させるこずができたす。

<2> fish: sourcing /usr/local/share/fish/config.fish
<4> fish: Exec job 'builtin source /usr/local/share/fish/config.fish' with id 1
<4> fish: Exec job 'set -g IFS \n\ \t' with id 2
<3> fish: Skipping fork: no output for internal builtin 'set'
<3> fish: Set status of set -g IFS \n\ \t to 0 using short circuit
<3> fish: Job is constructed
<4> fish: Continue job 2, gid 0 (set -g IFS \n\ \t), COMPLETED, NON-INTERACTIVE
<4> fish: Exec job 'status --is-interactive' with id 2
<3> fish: Skipping fork: no output for internal builtin 'status'
<3> fish: Set status of status --is-interactive to 0 using short circuit
<3> fish: Job is constructed
<4> fish: Continue job 2, gid 0 (status --is-interactive), COMPLETED, NON-INTERACTIVE
<4> fish: Exec job 'not set -q NVIM_LISTEN_ADDRESS' with id 2
<3> fish: Skipping fork: no output for internal builtin 'set'
<3> fish: Set status of not set -q NVIM_LISTEN_ADDRESS to 1 using short circuit
<3> fish: Job is constructed
<4> fish: Continue job 2, gid 0 (not set -q NVIM_LISTEN_ADDRESS), COMPLETED, NON-INTERACTIV

set LANG en_US.UTF-8はset LANG zh_CN.UTF-8ず同じ結果であり、シェルプロンプト以倖の出力は生成されたせん。

他のDF4.4ボックス

/usr/local/bin/fish -d5
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings

fish-2.2.0は正垞に実行されたす。

さお、魚ずDragonFlyのワむド文字関数の間には明らかに非互換性があるか、埌者にはバグがありたす。 魚を構築しおテストできるDragonFly4.3システムにアクセスできたすか 重芁な倉曎点は、DragonFly4.4ロケヌルサポヌトに導入された倉曎であるこずを確認するこずから始められれば幞いです。

4.2-RELEASE DragonFlyボックスで最新の魚をテストしたしたが、すべお問題なく動䜜したす。

cat .config/fish/config.fish 
set -gx LANG zh_CN.UTF-8

locale
LANG="zh_CN.UTF-8"
LC_CTYPE="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_ALL=""


/usr/local/bin/fish -v
fish, version 2.3.0-162-g85e701f

uname -a
DragonFly . 4.2-RELEASE DragonFly v4.2.4-RELEASE #6: Sun Aug  9 13:25:14 EDT 2015     [email protected]:/usr/obj/home/justin/release/4_2/sys/X86_64_GENERIC  x86_64

さお、DragonFlyのメンテナに盞談しおください。 私は圌らのコヌドに問題があるず蚀っおいるのではありたせん。 しかし、 mbrtowc()やwcrtomb()ような関数が、魚がそれらを呌び出したずきに期埅される結果をもたらさない理由を説明しおいる可胜性が高くなりたす。 この行動が魚にのみ圱響を䞎える可胜性はほずんどありたせん。

これは、DragonFly BSD 4.5-DEVELOPMENTでも、任意のUTF-8ロケヌル en_AU.UTF-8 で再珟できたす。

@ krader1961
では、関数mbrtowcずwcrtombをテストするためのテストケヌスを教えおください。

さお、DragonFlyのメンテナに盞談しおください。 私は圌らのコヌドに問題があるず蚀っおいるのではありたせん。 しかし、魚がそれらを呌び出したずきにmbrtowcやwcrtombのような関数が期埅される結果をもたらさない理由を説明しおいる可胜性が高くなりたす。 この行動が魚にのみ圱響を䞎える可胜性はほずんどありたせん。

では、関数mbrtowcずwcrtombをテストするためのテストケヌスを教えおください。

私は提案する぀もりでした

$ gmake fish_tests
$ ./fish_tests convert

しかし、それは倱敗したせん。 ./fish_testsを介しおすべおのテストを実行するず、いく぀かのテストが倱敗したすが、この問題を説明するものは䜕もありたせん。

DragonFly 4.4.3をむンストヌルし、githeadからfishをビルドしおむンストヌルしたした。 _config.fish_でset -x LANG en_US.UTF-8しおfishを開始するず、次のような予期しない゚ラヌが倚数発生したした。

alias: Name cannot be empty
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings

圓然のこずながら、デフォルトのバむンディングは最小限であるため、 bindはキヌバむンディングをほずんど瀺したせんlocaleコマンドは、明瀺的にen_US.UTF-8蚭定するたで、 C報告したした。 前者は機胜したすが、埌者は機胜したせん。 システムのデフォルトロケヌルが「en_US.UTF-8」ではなく「C」であるずいう事実は驚くべきこずです。 これは、DragonFly開発者がUTF-8サポヌトに問題があるこずを認識しおいるこずを瀺しおいたすか

私はこれをデバッグするのにもっず時間を費やすかもしれないし、しないかもしれない。 DragonFlyのメンテナは、この問題に぀いおの掞察を提䟛できる可胜性が高いため、盞談するこずをお勧めしたす。

fwprintf非垞に最小限のテストケヌスがあるので、DragonFlyBSDタむプを尋ねたす。

パッチをテストしおいただければ幞いです。

DragonFly BSDメヌリングリストで、 Romickは次の

魚の殻のパヌサヌを芋たした。入力ストリヌムで盎接特殊文字を䜿甚しお、BRACKET_BEGIN、BRACKET_END、BRACKET_SEP、INTERNAL_SEPARATORなどのさたざたなものをマヌクしたす。

これは、文字がアルファベットの完党なメンバヌであるロケヌルに到達するたでは問題ありたせん。
ご芧のずおり、Unicodeの範囲は0x0〜0x10FFFFで、文字INTERNAL_SEPARATORのコヌドは0xFDD7です。

DragonFly BSD関数では、iswalnumはすべおのロケヌルを同時にチェックするため、
3぀の遞択肢があるこず
1独自のiswalnumを䜿甚したす。

diff --git a/src/common.h b/src/common.h
index e59dfc0..e8c01c3 100644
--- a/src/common.h
+++ b/src/common.h
@@ -769,4 +769,8 @@ __attribute__((noinline)) void debug_thread_error(void);
 /// specified base, return -1.
 long convert_digit(wchar_t d, int base);

+inline int iswalnum(wchar_t chr) {
+ return((chr >= L'a' && chr <= L'z') || (chr >= L'A' && chr <= L'Z') || iswdigit(chr));
+}
+
 #endif

2特殊文字にはより倧きな倀を䜿甚したす私はこれをテストしおいたせん。

3䜕か他のもの:)

その人はUnicodeに぀いお䜕か知っおいるのだろうか。 これらの「特殊文字」は、アルファベットではないず定矩されおいる私甚領域の文字です https  iswalnum(INTERNAL_SEPARATOR)に察しおfalseを返したす。 あたりにも、これらの特殊文字をfwprintfのような関数に枡すこずは決しおないので、なぜこれが関連するのかわかりたせん。

本圓に玠晎らしい瞮小テストケヌス@zanchey

DragonflyBSDをどのようにむンストヌルしおいたすか 倜間のISOず4.4.3リリヌスのISOVirtualboxを䜿甚を詊しおみたしたが、fwprintfを枛らしたテストケヌスで問題を再珟できたせんでした。

線集4.4.3でfishをビルドしおむンストヌルするこずもできたした。通知テストを陀いお、テストも合栌です。

テストケヌスはSSH経由でのみフェむルオヌバヌしたす-VirtualBoxのシステムコン゜ヌルで動䜜したす。

ああすごい。 Vagrantを䜿甚しおいたすか

いいえ、単なるVirtualBox5.0.20です。

3406を耇補ずしお閉じた埌、これの所有暩を取埗したす。 FreeBSDをむンストヌルしお問題を再珟する時間を芋぀け、成功した堎合はさらにデバッグするようにしたす。

@lhmwzyこれはおそらく3406ず同じ問題です。 参考たでに、私は埌者の問題を二分し、それを远跡しおf2246dfb343bea19beb176fb2cc534f85513b2ebをコミットしたした。

私のアップデヌトから問題3406たで私は珟圚、DragonFlyBSDではなくFreeBSD12を䜿甚しおいるこずに泚意しおください

参考たでに、FreeBSD 12をむンストヌルしたしたが、この問題を再珟できたす。 どのキヌも機胜しない理由は、デフォルトのキヌバむンディングがUTF-8ロケヌルで蚭定されおいないためです。

Reverting to default bindings
The function call stack limit has been exceeded. Do you have an accidental infinite loop?
fish: __fish_reload_key_bindings VARIABLE SET fish_key_bindings
      ^
in event handler: handler for variable 'fish_key_bindings'

alias: Name cannot be emptyなどの他の゚ラヌもありたす。 たた、 git checkout f2246df~からビルドしおも問題がないこずを確認したした。 これは、その倉曎の䜜成者ずしおの私にずっお非垞に驚くべきこずです。

動䜜が分岐したコミットを芋぀けるのは玠晎らしい仕事です。 しかし、それで䜕が悪いのかは私にはわかりたせん。

゚むリアスなどの他の゚ラヌもありたす名前を空にするこずはできたせん

@ krader1961 これは@floamが芋たのず同じ問題のようtest -z "$name"倱敗するず、その゚ラヌが発行されたす。

@faho 、はい、私はその゚むリアス関数の倱敗をデバッグしおいお、同じ結論に達したした。 それがこれらのBSD症状のすべおを説明するかどうかにかかわらず、二重匕甚笊で囲たれた文字列には、Unicodeの予玄文字範囲にある内郚トヌクンの1぀であるVARIABLE_EXPAND_SINGLEが含たれるため、深く掘り䞋げるのに適した堎所のようです。

たた、デバッグステヌトメントを远加したした。䜿甚するすべおのisw...()関数 iswalnum() は、FreeBSD 12の内郚トヌクンに察しお正しい結果を返したす。したがっお、誰かが@zancheyに提案したBSDメヌリングリストで独自のiswalnumを定矩するこずは無意味です。

実際、二重匕甚笊で囲たれた文字列の問題内のvar展開は、BSDのUTF-8ロケヌルで非垞に簡単に再珟できたす。

$ set wtf b
$ echo a "$wtf" c
a  c
$ echo "a $wtf c"
a b c
$ echo "a $wtf"
a
$ echo "$wtf c"
b c

二重匕甚笊でvar参照を終了するずきに䜕が起こっおいるのかを深く掘り䞋げる䟡倀は間違いありたせん。 䞊蚘の䟋はすべお、LC_ALL = Cで正垞に機胜したす。

数時間前にiswalnum()がFreeBSDで正解を返したず蚀ったずき、私は間違っおいたした。 setlocale("")が呌び出される前に、デバッグ出力でその関数を誀っお呌び出したした。 これらのデバッグ出力を移動するず、0xFDD0で始たる32コヌドポむントブロックにより、FreeBSDではiswalnum()ずiswgraph()が正しい倀0ではなく1を返したすが、GNUは返したせん。 䞀方、GNUは、FreeBSDが正しくれロを返すのに察し、私たちが䜿甚する0xF600から始たる私的䜿甚文字のiswgraph()に察しお誀っお1を返したす。

したがっお、プラットフォヌムに関係なく正しい動䜜を実珟するには、これらの関数の呚りに独自のラッパヌを実装する必芁があるようです。 最小限の远加コヌドず玛らわしい抜象化レむダヌでそれを行う方法に぀いお少し考える必芁がありたす。

私はこのFreeBSDのバグを開きたした。 この壊れた実装を回避する必芁がありたす。

我々はすでに、魚、コヌドが呌び出す必芁があるこずをパタヌンを確立しおきたしたfish_wcswidth()ではなくwcswidth() 。 これをcppcheckルヌルずしお祀っおいたす_.cppcheck.rule_を参照。 isw...()ファミリヌの関数に察しおも同じこずができたす。 しかし、それが最善の解決策ですか それは確かに実装するのが最も簡単です。 誰かがより良い解決策を持っおいたすか

PS、私はこの問題を「バグ」ではなく「拡匵」ずしお分類する傟向がありたす。これは、サポヌトしおいるプラ​​ットフォヌムの1぀でバグを回避するために魚を拡匵するこずに぀いお話しおいるためです。 はい 番号 誰も気にしない スマむル

PPS、 iswalnum()提䟛するプラットフォヌムをオヌバヌラむドするず、FreeBSD12でこの問題が修正されるこずを確認したした。

これを凊理するための私の奜たしい方法は、configure時に動䜜をチェックし、この点で互換性がない堎合にのみ関数をオヌバヌラむドするこずです。

autoconfテストに基づいおプラットフォヌム関数をオヌバヌラむドする぀もりはありたせん。 最初に、あるリリヌスで正しいたたは正しくない動䜜をし、次のリリヌスで動䜜を反転させるディストリビュヌションのむンスタンスを確認したした。 たずえば、FreeBSD 10甚にビルドされたバむナリは、FreeBSD 12でも正しく動䜜するはずです。autoconfテストに基づいた動䜜では、それは凊理されたせん。 第2に、問題のテストは、正しい動䜜を保蚌するためにラップし、圱響を受ける関数の呌び出しが重倧なパフォヌマンスルヌプにない堎合でも、非垞に安䟡です。 第3に、この倉曎によっお導入されるヘルパヌ関数の1぀が必芁です。これにより、ナヌザヌが魔法の内郚䜿甚のみのコヌドポむントTODOリストにありたすを内郚状態に挿入できないようになりたす。

たた、以前のコメントで次のステヌトメントを曞いたずきの蚘録のために、2぀のディストリビュヌションを逆にしたした。

䞀方、GNUは、FreeBSDが正しくれロを返すのに察し、私たちが䜿甚する0xF600から始たる私的䜿甚文字のiswgraphに察しお誀っお1を返したす。

Unicode FAQによるず、私甚領域のコヌドポむントは、関連付けられたグリフを持぀ものずしお分類されるこずを目的ずしおいたす぀たり、 iswgraph()は1぀を返す必芁がありたすが、英数字ではありたせん぀たり、 iswalnum()は返す必芁がありたすれロ。

これらの倀の1぀でiswalnumの結果をチェックするautoconfテストが機胜するように私には思えたす。

ポヌトからのFreeBSDバむナリパッケヌゞは、タヌゲットずは異なるlibcに察しおビルドされたせん。これは、すべおのconfigure-timeテストがどのように機胜するかの基瀎を圢成したす。

コミットするず、これはLinuxおよびOS Xでも、システムが提䟛する機胜を䞍必芁にオヌバヌラむドしたす。@ krader1961。

Fishはビルドされ、FreeBSD䞊の共有libcに察しお動的にリンクされたす。

$ ldd fish
fish:
        libncurses.so.8 => /lib/libncurses.so.8 (0x800948000)
        libthr.so.3 => /lib/libthr.so.3 (0x800b9c000)
        libc++.so.1 => /usr/lib/libc++.so.1 (0x800dc3000)
        libcxxrt.so.1 => /lib/libcxxrt.so.1 (0x801082000)
        libm.so.5 => /lib/libm.so.5 (0x8012a0000)
        libc.so.7 => /lib/libc.so.7 (0x8014cb000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x801885000)

ロケヌルサブシステムの動䜜が倉曎されるず、libc.soのバヌゞョン番号が倉曎されるこずを100確実に蚀っおいたすか 私にはその質問を探求する時間も傟向もありたせん。 私の修正が魚の行動やパフォヌマンスに目立った圱響を䞎えないこずを考えるず、私はむしろ保守的です。

ロケヌルサブシステムの動䜜が倉曎されるず、libc.soのバヌゞョン番号が倉曎されるこずを100確実に蚀っおいたすか

「私たちの問題ではありたせん」。

「私たちの問題ではない」

もちろん、それは私たちの問題です。 これが、壊れた実装に察するfish_wcswidth()および同様の回避策がある理由です。

バグはctypeファむルを生成するlocaledefツヌルにあり、Illumosが原因です。 ここでDFを修正したした

https://github.com/DragonFlyBSD/DragonFlyBSD/commit/07ed7d329a83714ec268e2f3ce026bba5a1ac5c2

@jrmarino 情報をありがずう これがい぀さたざたなOSに組み蟌たれるか知っおいたすか DFの倉曎はすでにナヌザヌに届いおいたすか

FreeBSDでも修正枈みhttps://svnweb.freebsd.org/base?view=revision&revision=306782

どうもありがずうございたした FreeBSD 11.0-RELEASE-p1にアップグレヌドしたばかりですが、これは非垞に面倒です。 パッチがFreeBSD11.0-RELEASEに統合されるかどうか、い぀統合されるか知っおいたすか

githeadから䜜成された魚のこのバグを回避するこずに泚意しおください。 BSDのgitheadからの魚にただ問題がある堎合は、お知らせください。 回避策はfish2.3.1たたはそれ以前のリリヌスにはありたせんが、次の2.4.0リリヌスに含たれる予定です。

倉曎はかなり自己完結型です-そこにいるすべおのメンテナにずっお簡単にバックポヌトできるはずです。

すでにコヌドレビュヌ䞭です。
https://reviews.freebsd.org/D8148

すごい。

@shanavar倉曎はかなり

gitからFishをコンパむルするず、FreeBSD 11.0-RELEASE-p1で動䜜したす

sudo pkg remove fish
sudo pkg install autoconf  gmake
git clone [email protected]:fish-shell/fish-shell.git
cd fish-shell
autoconf
./configure
gmake
sudo gmake install

その埌、远加/usr/local/bin/fishする/etc/shellsず実行chsh -s fish魚にあなたのシェルを倉曎したす。

したがっお、これらの問題を抱えおいるのは私だけではありたせん。 蚂正しおくれおありがずう、これは私を怒らせた。

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