比較する:

比較する:

ssh経由で使用する必要があります。Rubyネットワーク/SSH) はフォルダを繰り返しコピーし、サブフォルダを除外します。私はこれを行う最速の方法を探しているので、rsyncいいえ。また、ssh代わりにshbash

Bashでは、次のことを行います。

cp -r srcdir/!(subdir) dstdir

そしてそれは素晴らしい作品です。ただし、次のようにsshスクリプトを起動すると、

sh: 1: Syntax error: "(" unexpected

使用されているからですsh

マニュアルページを確認しましたが、shファイルを除外するオプションはありません。

sshこれがsh私が使用している正しい仮定ですか?代替案はありますか?

編集1: 動作している場合、出力はsudo cat /etc/shells次のようになります。

# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen

編集2: わかりましたので、bashを使用できますが、これは問題ではないようです。実際にsshが使用されていることを確認しましたbash。この問題は、括弧や感嘆符のエスケープに関連しているようです。シェル(macos)でコマンドを実行してみましたが、実際のコマンドは次のとおりです。

ssh -i .ssh/key.pem [email protected] 'mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'

これにより他のエラーが発生します。

cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory

編集3: コメントに基づいて追加のコマンドを変更しました。extglob

私が使うなら

ssh -i .ssh/key.pem [email protected] 'shopt -s extglob; mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'

次のエラーが発生します。

cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory

かっこを抜けないと手に入る

bash: -c: line 0: syntax error near unexpected token `('

ベストアンサー1

SSH は、リモートシステムが何であれ、リモートシステムでログインシェルを実行します。ただし!(foo)、必須であるため、shopt -s extglobリモコンに設定していない可能性があります。

SSHがリモート側でBashを実行していることを確認するには、次のようにします。

ssh me@somehost 'echo "$BASH_VERSION"'

印刷される項目があるが起動スクリプトが設定されていない場合は、extglob次に渡されるコマンドに基づいて手動で実行できますssh

ssh me@somehost 'shopt -s extglob
    echo srcdir/!(subdir)'                                 
 # or
ssh me@somehost $'shopt -s extglob\n echo srcdir/!(subdir)'   

extglobコマンドラインの解析に影響を与え、改行後にのみ適用されるため、リテラルの改行を入れる必要があり、セミコロンでは不十分です。

ssh me@somehost 'shopt -s extglob; echo srcdir /!(サブディレクトリ) '

同様に、バックスラッシュを使用して括弧をエスケープすると、他のグローバル文字と同様に特殊属性が失われます。この場合、あなたは望む仕事ではありません。

$ touch foo bar; shopt -s extglob; set +o histexpand
$ echo *
bar foo
$ echo !(foo)
bar
$ echo \*
*
$ echo !\(foo\)
!(foo)

おすすめ記事