tmux 新しいウィンドウコマンドとスペースを含む引数 - bash var

tmux 新しいウィンドウコマンドとスペースを含む引数 - bash var

新しいtmuxウィンドウでコマンドを実行しようとしています。シンプルなコンソール/ターミナルPDFリーダー。スクリプトにはパラメータ、PDFファイルが必要です。ファイル名にはスペースを含めることができます。私はこれを試しました:

#!/bin/bash

tmux new-window "pdftotext -layout -nopgbrk "${1}" - | less"

空白のないファイルに対して機能します1.pdf。たとえば、代わりにsh、代わりに効果がありません。bash$1"$1""${1}"

答え1

tmux new-windowコマンドをシェルに渡します。大丈夫です。コマンドはパイプであり、それを処理するにはシェルが必要です。ただし、これはコマンドを文字列として処理し、それを解釈するシェルがあることを意味します(たとえば、これをsh -c行います)。

tmux new-window(たとえば)複数の引数を使用してssh内部(リモート)シェルのコマンド文字列を作成することは可能です。ssh私はまだこれらのツールについて単一の主張を提示することを好みます。

内部シェルを引用し、スクリプトを解釈するシェルも引用する必要があります。つまり、シェルが$1引用符を置き換えて削除した後、文字通り使用されず、渡された文字列を引用する必要があるすべてが、tmux new-windowシェル内で適切に引用されるシェルコマンドを形成するように完全なtmuxコマンドを作成する必要があります。 。

明らかなアイデアは、追加の引用符を挿入することです。しかし、ここには欠陥があります。

#欠陥、tmux new-window "pdftotext -layout -nopgbrk \"${1}\" - | less"しないでください。

#欠点もありません
tmux 新しいウィンドウ "pdftotext -layout -nopgbrk '${1}' - | less"

"$、、、またはを含む引数は、 1つのコマンド`および/または別のコマンドを中断します。さらに悪いことは、コード挿入の脆弱性が発生することです。つまり、不運または悪意のあるパラメータの場合、スクリプトはパラメータの一部をシェルコードとして実行します。\!'

あなたのスクリプトはBashを使います。 Bash自体$1に引用された形式に拡張するように要求できます。安全方法。これは次のために発生します。Q修飾子:

#!/bin/bash
tmux new-window "pdftotext -layout -nopgbrk ${1@Q} - | less"

拡張されているものが何であれ、$1外部シェルは${1@Q}内部シェルを正しく参照するように見える形に拡張されます。

関連情報