От Вашей ssh сессии имейте Вас, пытался запуститься gnome-session
? Вам просто нужен X-сервер, работающий на Вашем клиентском компьютере.
Когда Вы используете $()
оболочка выполнит содержание в фигурных скобках как команда.
Нельзя использовать пробелы прежде/после того, как =
символ.
Таким образом, Ваша команда будет как
SNAPSHOT=SnapshotIR$TODAY*.csv
или
SNAPSHOT=SnapshotIR${TODAY}*.csv
PS. Если необходимо сделать некоторые операции с этим, регистрирует на следующем шаге, лучше использовать for
цикл как
for file in SnapshotIR${TODAY}*.csv ; do smth ; done
вызовите в случае, если у Вас есть несколько файлов, соответствующих Вашему шаблону, [ -f ${SNAPSHOT} ]
конструкция возвратит ошибку как:
[ -f f* ] && echo ok
-bash: [: filename: binary operator expected
Не используйте пробелы вокруг =
при присвоении переменных.
Кроме того, я не думаю, что Вы хотите включить что SNAPSHOT
присваивают в $( )
поскольку это пытается выполнить его как команду.
На ноте стороны рассмотрите к нижнему регистру свои переменные.
Таким образом, то, что Вы хотите, может быть
today=$(date +"%m%d%Y")
snapshot=SnapshotIR$today
if [ -f ${snapshot}*.csv ]
${snapshot}*.csv
, весь ад вырвется на свободу.
– Gilles 'SO- stop being evil'
13.02.2013, 02:47
SNAPSHOT = $(SnapshotIR$TODAY*.csv)
У Вас не может быть пространства в присвоениях. Кроме того, $(…)
замена команды: эта строка пытается выполниться SnapshotIR02122013_2239.csv
как программа.
В ударе, ksh или zsh, наборе SNAPSHOT
быть массивом, содержащим список соответствия именам файлов.
SNAPSHOT=("SnapshotIR$TODAY"*.csv)
Если нет никакого файла соответствия, шаблон оставляют нерасширенным. В ударе или zsh, набор nullglob
опция получить пустой массив вместо этого. В ksh, помещенном ~(N)
в начале шаблона (т.е. SNAPSHOT=(~(N)"SnapshotIR$TODAY"*.csv)
). Можно затем протестировать, если были какие-либо файлы соответствия путем тестирования длины массива.
shopt -s nullglob
SNAPSHOT=("SnapshotIR$TODAY"*.csv)
if [ ${#SNAPSHOT} -eq 0 ]; then
echo 1>&2 "No snapshot file for $TODAY"
exit 2
elif [ ${#SNAPSHOT} -gt 1 ]; then
echo 1>&2 "Multiple snapshot files for $TODAY, I don't know which one to pick"
exit 2
fi
echo "The snapshot file is ${SNAPSHOT[0]}"
В оболочках без массивов можно использовать функцию, которая получает список соответствий и считает их. Если там не идет ни в какое сравнение, функция получает нерасширенный шаблон.
set_snapshot () {
if [ $# -gt 1 ]; then
echo 1>&2 "Multiple snapshot files for $TODAY, I don't know which one to pick"
exit 2
elif [ -e "$1" ]; then
SNAPSHOT=$1
else
echo 1>&2 "No snapshot file for $TODAY"
exit 2
fi
}
set_snapshot "SnapshotIR$TODAY"*.csv
echo "The snapshot file is $SNAPSHOT"
(Отметьте то использование [ -e "$1" ]
протестировать, оставили ли шаблону нерасширенные сбои в патологических случаях такой как [0-9]
когда нет никакого файла, имя которого является единственной цифрой, но существует файл с 5 именами персонажа [0-9]
. Этого не может произойти с только *
или ?
метасимволы, так как они соответствуют себе.)
Следующий подход работает в некоторой степени:
SNAPSHOT=SnapshotIR$TODAY"*.csv
if [ -e $SNAPSHOT ]; then …
Начиная с расширения $SNAPSHOT
оставлен неупомянутым, это рассматривают как разделенный от пробела список подстановочных шаблонов, который в порядке здесь. Однако, если будет больше чем один файл соответствия, то соответствия будут рассматриваться как отдельные аргументы [
команда, и это вызовет синтаксическую ошибку. (С особенно обработанными именами файлов это могло даже вызвать неправильный результат.), Таким образом, я не рекомендую этот подход, это является слишком хрупким.
${#snapshot[@]}
, идеально (( ! ${#snapshot[@]} ))
, хотя в этом конкретном случае, тестирующем 0th элемент, даст иллюзию работы так или иначе.
– ormaaj
23.02.2013, 02:23
${#foo}
длина первого элемента массива. При контакте с массивом имен файлов, которые не могут быть пустыми, ${#foo}
0, только если массив пуст.
– Gilles 'SO- stop being evil'
24.02.2013, 02:32