回答をオンラインで検索してみましたが、回答(存在する場合)はシェルスクリプトの他のドットアプリケーションによって隠されていました。だからそれはすべてです。
編集する:これはFedoraの基本構成に関連しているため、command_not_found_handle
bashソースコードとは何の関係もないことがわかりました。/編集する
Bashは一般的にコマンドの欠落について文句を言いますが、コマンドラインに入力したものもディレクトリであることがわかりました。
[root@localhost tmp] # mkdir test
[root@localhost tmp] # test
[root@localhost tmp] # nonexistent
bash: nonexistent: command not found...
[root@localhost tmp] # test
[root@localhost tmp] # cd test
[root@localhost test] # empty
bash: empty: command not found...
[root@localhost test] # .
bash: .: filename argument required
.: usage: . filename [arguments]
[root@localhost test] # ..
上記は明らかに有効で予想される。しかし、これらは:
[root@localhost test] # ....
[root@localhost test] # .........................
[root@localhost test] # .whatever
[root@localhost test] # ..........whatever
[root@localhost test] # ......œę©æąðæćþóœ
[root@localhost test] # .ignored
[root@localhost test] # touch .whatever
[root@localhost test] # .whatever
[root@localhost test] # file .whatever
.whatever: empty
[root@localhost test] # file .ignored
.ignored: cannot open '.ignored' (No such file or directory)
[root@localhost test] # .ignored
[root@localhost test] # .whatever follows is just discarded
[root@localhost test] #
入力した内容を静かに無視してください。
これは人々が期待するものではありません。このような行動に理由がありますか?
編集:ユースケースを見つけました!
[root@localhost ~] # ...|cat
[root@localhost ~] # ...|nonexistent
bash: nonexistent: command not found...
[root@localhost ~] # ...|nonexistent && echo works
bash: nonexistent: command not found...
[root@localhost ~] # ...|nonexistent || echo works
bash: nonexistent: command not found...
works
[root@localhost ~] # ...|cat && echo works
works
[root@localhost ~] # ...|cat || echo works
[root@localhost ~] #
PATH
明らかに、これにより、実行可能ファイルを実行せずに実行可能ファイルが開いていることを確認できます。 catがブロックされていないことがわかります。実装されていません。
これはちょっと面白いです。楽しくお過ごしください!
[root@localhost ~] # LANG=en bash --version
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
編集2:
[root@localhost ~] # declare -f command_not_found_handle
command_not_found_handle ()
{
local runcnf=1;
local retval=127;
[[ $- =~ i ]] || runcnf=0;
[[ ! -S /var/run/dbus/system_bus_socket ]] && runcnf=0;
[[ ! -x '/usr/libexec/packagekitd' ]] && runcnf=0;
[[ -n ${COMP_CWORD-} ]] && runcnf=0;
if [ $runcnf -eq 1 ]; then
'/usr/libexec/pk-command-not-found' "$@";
retval=$?;
else
if [[ -n "${BASH_VERSION-}" ]]; then
printf 'bash: %scommand not found\n' "${1:+$1: }" 1>&2;
fi;
fi;
return $retval
}
答え1
予期しない動作はFedoraの基本的な実装によるものですcommand_not_found_handle
。私にその存在を教えてくれた@TNWに感謝します。
その後はunset command_not_found_handle
期待通りに働きました。
これがバグなのか限界なのかわかりません。