scpのBashスクリプトは、チルダ(〜)をすばやく解釈します。

scpのBashスクリプトは、チルダ(〜)をすばやく解釈します。

それで私はLinux環境でプログラムする必要がある新しいC ++プロセスを始めました。私のコンピュータにLinuxがインストールされていませんが、OSが私のコンピュータで動作しません。

私は、ローカルコンピュータにダウンロードしたファイルをリモートコンピュータに配置して編集してプログラムを作成し、再びローカルコンピュータに配置してアーカイブアカウントにアップロードする必要があることがよくあります。入力に疲れて、これを行うためのエイリアスを作成することにしました。それから私はエイリアスがこの種のことを処理できないことに気づき、代わりにシェルスクリプトを書くことにしました。これが私が得るものです:
scp -P xx [email protected]:~/filename filename

#!/bin/bash

# Author: me
# Created 26 August 2014
# transfers a file from remote machine to current directory in local machine
# keeps same filename

location="$1"
# name gets just the part of the path after the last slash
# ie the filename
name="$(echo "$1" | sed -n -e 's/^.*\///p')"
# echo "$location"
# echo "$name"
scp -P xx [email protected]:"$location" "$name"

理論的には、これを入力するだけget ~/path/to/filenameでリモートホストからファイルをインポートして(同じファイル名で)自分のローカルコンピュータの現在のディレクトリにコピーできます。

このscpコマンドは、コマンドラインから実行するとうまく機能します。シェルスクリプトに貼り付けると競合が発生します。エラーが発生します。No such file or directory

多くのテスト(上記のデバッグ出力に注釈付きの一部を見ることができます)と研究の最後にシェルが拡張されていることがわかりました。~ 今後それはそれをスクリプトに送ります(まあ、それは私がglobについて知っていることに基づいて私の推測です)。その後、私のスクリプトは私のパスでファイルを探します。地元の代わりに端末のホームフォルダ離れてマシンのホームフォルダ。どうすればこれをやめることができますか?

この質問を入力しながら、コマンドを実行するときにいくつかの引用符が必要な場合があることに気づきました。しかし、実際にはそうしたくありません。タイピングを行わなくても、この問題を何とか解決できます。get "~/filename"なぜなら、これらの引用符をタイプしなければならないというのが本当に迷惑なことだからです。

無関係な情報が多ければ申し訳ありませんが、少なすぎるよりも多すぎる方が良いと思います。ありがとうございます!

PS:見つかりましたこれSSH構成情報。便利ですが、正確なファイル名を2回入力する必要があるため、必要なだけ怠惰ではありません。

ベストアンサー1

デフォルトでは、リモートパスはホームディレクトリに基づいて解釈されるため、scpこれをまったく実行する必要はありません。~

scp [email protected]:some/file/name filename

some/file/nameホームディレクトリからダウンロードされ、ローカルにuser保存されますfilename。リモートサーバーで絶対ファイルパスを使用するには/:で始まりますscp host:/etc/passwd passwd

厳密に言えば、サーバーは状況を異なる方法で解釈できます。この場合、~毎回コマンドラインで繰り返すのではなく、スクリプトに入れることができます(必要に応じて怠惰に使用してください!)。

scp [email protected]:~/"$location" "$name"

これにより、シェルはこれを解釈する機会を得られません。 (引用することもできます:または~コマンドラインで、しかしこれは必要以上の作業です。)しかし、上記の最初のアプローチはうまくいくと思います。\~'~'


変数に関するもう1つの注意事項ですname。基本ファイル名として使いたいと言われました。この目的のために特別なコマンドがあります。basename注文する:

name="$(basename "$location")"

これはすべてを実行するよりも簡単ですsed

おすすめ記事