BASHオートコンプリート時にpmountがハングする

BASHオートコンプリート時にpmountがハングする

pmountターミナルでオートコンプリートを使用しようとするたびに停止するまでターミナルが停止し、オートコンプリートがCTRL+C実際に実行されます。オートコンプリートは他のすべてでうまく機能し、興味深いことに、作業ディレクトリとは無関係にマウントされたすべてのドライブを介して削除を直接正常pumountに自動完了できます。pmount

非常に明確なステップバイステップのプロセスリスト:

#start pmount
pmount /de<TAB to autocomplete>
#terminal is frozen
<press CTRL+C once to unfreeze>
pmount /dev/s
pmount /dev/sd<TAB to autocomplete>
#frozen again - note the "d"
<press CTRL+C once to unfreeze>
pmount /dev/sdb

この場合、/dev/sdbフラッシュドライブのみが存在するため、オートコンプリート機能はもう少しスマートになり、例を提供していませんが、/dev/sdaまだ停止します。

zshオートコンプリートはうまく機能しますpmountが、あまりインテリジェントではない構成されていない新しいインストールをテストしました。pmount /dev/s<TAB>選択項目は に減りませんが、/dev/sdb「ルートハードドライブ」も含まれ、/dev/sda現在のpumount <TAB>作業ディレクトリ項目を自動補完します。

そのため、BASHのいわゆるスマートオートコンプリート動作に関連していると仮定していますが、その動作がどこに設定されているのかさえ理解できないため、リモートで問題を解決することはできません.

この問題を解決する方法と問題の原因に関するアイデアはありますか?

システムはDebian 8、pmountバージョンは0.9.23、BASHバージョンは4.3.30です。

ベストアンサー1

/etc/bash_completion.d/pmountオートコンプリート参照ファイルは私のシステムに保存されます。

解決策1:ファイル(再)移動/名前を変更する

Tom Huntが提案したように、これは最も簡単な解決策です。停止は停止しますが、オートコンプリートはインテリジェントではありません。つまり、現在のディレクトリのファイル名が保持されます。

解決策2:オートコンプリートファイルの回復

参照ファイルの問題は、_pmount()ファイルの行62にある関数で発生します(読みやすくするために新しい行が追加されました - 元のファイルにはありません)。

devices="$( command ls $(grep -v '^[[:space:]]*#' /etc/pmount.allow )\
$(grep 1 /sys/block/*/removable |\
sed -e 's,/sys/block/,/dev/,;s,/removable:1,*,') 2>/dev/null |\
sort -u | sed -e 's,\(^/dev/\)\(.*\),\1\2 \2,' ; \
#this last line is of interest, as the errors occur here
grep $mdir /proc/mounts | sed -e 's,.*\($mdir/[^ ]*\).*,\1,' )"

間違いは

grep $mdir /proc/mounts

変数が$mdir以前に定義されていないため、スクリプトは中断されます。

だから定義を追加しました。mdir

mdir="$(readlink -f /media)"

_pumount()36行目と同じスクリプト(75行目を参照)mdirから取得した関数は、エディア(または数字)目次pmountこれに加えて、セキュリティ上の理由で関数のローカル変数も追加しました( 25mdir_pmount())。

これで、オートコンプリート機能が中断されますが、リムーバブルドライブのパーティションがマウントされている場合は、マウントされたドライブ、そのマウントポイント、および次のようなすべて/proc/mountsの情報が表示されるため、奇妙に動作します。

/media/sdc1
rw,nosuid,nodev,noexec,relatime,uid=1000,gid=1000,fmask=0177,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,quiet,utf8,errors=remount-ro

これは、エラーが発生したのと同じ行62によって生じる。今問題は次の部分にあります。

grep $mdir /proc/mounts | sed -e 's,.*\($mdir/[^ ]*\).*,\1,'

一重引用符が評価を抑制するため、コマンドが失敗する必要がある場合sed(たとえば、期待どおりに機能しないか、コマンドで失敗しない)$mdirを二重引用符に変更しました。

grep $mdir /proc/mounts | sed -e "s,.*\($mdir/[^ ]*\).*,\1,"

pmountオートコンプリート機能は情報をスキップしますが、マウントポイントを含む/proc/mountsマウントされたパーティションを表示し続けます。/media/sdc1

標準的な動作が何であるかはわかりませんが、マウントされたpmountすべてのパーティションのリストを実際に抑制するために、次のことを行いました。 (読みやすくするために改行を追加 - オートコンプリートスクリプトにある必要があります)削除):

 devices="$( command ls $(grep -v '^[[:space:]]*#' /etc/pmount.allow )\
 $(grep 1 /sys/block/*/removable |\
 sed -e 's,/sys/block/,/dev/,;s,/removable:1,*,') 2>/dev/null |\
 sort -u | sed -e 's,\(^/dev/\)\(.*\),\1\2 \2,' \
 #previous block identical to original script
 #the following pipe replaces a semicolon from the original script
 #and so does anything that follows 
 | grep -v "$( if [[ $( grep $mdir /proc/mounts ) ]] ;
               then grep $mdir /proc/mounts |\
                    sed -e "s,.*\($mdir/[^ ]*\).*,\1," \
                        -e "s,$mdir/,," -e 's, ,\|,g' ;
               else echo $mdir ; fi \
             )"
 )"

元のスクリプトとは異なり、grep最初の2つの出力は、インポートされたマウントではなくgrepマウントされたパーティションがフィルタリングされるようにパイプされます。このループは、空のパーティションとマウントされたパーティションを区別する必要があります。/media/proc/mountsif/media

これらの変更により、pmount動作は次のようになります。

pmount <TAB to autocomplete>
/dev/sdc   /dev/sdc1  /dev/sdc2  /dev/sr0   sdc        sdc1       sdc       sr0
pmount sdc1
#successful mounting of sdc1
pmount <TAB to autocomplete>
/dev/sdc  /dev/sdc2  /dev/sr0  sdc       sdc2       sr0

つまり、マウントされたパーティションは表示されませんが、ドライブの他のパーティション(およびドライブ自体)は引き続き表示されます。

mdir最初のステップで定義の重要性を覚えておいてください!

注意事項pmount

この検索は自動的に行われます/sys/block/*/removable1つまり、リムーバブルビットが設定されているデバイスのみが一覧表示されます。ただし、他のドライブは、たとえば入力してインストールできますが、オートコンプリートpmount /dev/sdd1には表示されません。 AFAIK これは予想される動作なので、そのままにします。私の場合、パーティションを実行していた外付けハードドライブでこれが発生しましたext4

おすすめ記事