cp funktioniert nicht im Skript, sondern im Terminal

7

Nun, das ist ein seltsames Problem, ich habe diese Art von Skript:

CWD="$(cd -P -- "$(dirname -- "$0")" && pwd -P)"
RESOURCES_PATH="${CWD}/resources"

PROJECT_NAME="something"

DRUSH_ALIASES_EXAMPLE_PATH="${RESOURCES_PATH}/example.aliases.drushrc.php"
DRUSH_ALIASES_PATH="~/.drush/${PROJECT_NAME}.aliases.drushrc.php"

cp ${DRUSH_ALIASES_EXAMPLE_PATH} ${DRUSH_ALIASES_PATH}
echo "cp ${DRUSH_ALIASES_EXAMPLE_PATH} ${DRUSH_ALIASES_PATH}"

Wenn ich versuche, diese Art von Skript auszuführen, wird folgende Fehlermeldung angezeigt: "cp: Es kann keine reguläre Datei" ~ / .drush / Something.aliases.drushrc.php "erstellt werden. Es gibt keine solche Datei oder kein solches Verzeichnis."

Aber das Lustige ist, dass der Befehl einwandfrei funktioniert, wenn ich die Ausgabe von "echo" kopiere und direkt in das Terminal einfüge. Ich bin verwirrt, irgendwelche Ideen, was mit dem obigen Skript falsch sein kann?

Łukasz Zaroda
quelle

Antworten:

11

Versuchen Sie es mit , $HOME/.drush...anstatt ~/.drush....das "~"scheint nicht zu Ihrem Home - Verzeichnis erweitert werden.

Zelda
quelle
6
Ja, weil ~es nicht erweitert wird, wenn es zitiert wird. Natürlich sollten auch die Argumente cpangeführt werden, um Überraschungen zu vermeiden.
Derobert
1
~/"quoted name"wird auch funktionieren.
Mark Plotnick
1

Das Tilde- ~Zeichen für das Home-Verzeichnis funktioniert nur am Anfang eines Wortes, am Anfang eines zugewiesenen Werts oder (für die Zwecke der PATH-Zuweisung) nach einem Doppelpunkt in einem zugewiesenen Wert. Es darf nicht zitiert werden.

Da ~durch die Shell erweitert wird, bedeutet die Tatsache, dass Sie es gemeldet sehen cp, dass Sie ein Shell-Erweiterungsproblem haben.

Hier steht die Tilde in doppelten Anführungszeichen, daher wird sie nicht erweitert. Verwenden Sie eine der folgenden Methoden:

DRUSH_ALIASES_PATH=~/".drush/${PROJECT_NAME}.aliases.drushrc.php"
DRUSH_ALIASES_PATH="$HOME/.drush/${PROJECT_NAME}.aliases.drushrc.php"
Gilles 'SO - hör auf böse zu sein'
quelle
0

Mit können bashSie auch die interne Zeichenfolgensubstitution über die Parametererweiterung verwenden , um das Tilde-Zeichen ~durch den Wert von zu ersetzen $HOME.

Nicht sehr elegant, kann aber nützlich sein, wenn Sie sich über ein mögliches ~Zeichen in einer an Sie übergebenen Dateipfadzeichenfolge nicht sicher sind (hier nicht der Fall).

unset HOME
HOME="$(eval 'echo ~')"

- cp ${DRUSH_ALIASES_EXAMPLE_PATH} ${DRUSH_ALIASES_PATH}
+ cp "${DRUSH_ALIASES_EXAMPLE_PATH/#\~/${HOME}}" "${DRUSH_ALIASES_PATH/#\~/${HOME}}"
Tilo
quelle