кавычки внутри обратных кавычек внутри кавычек в ksh

Абсолютный путь

  • должен начинаться с /
  • не содержать никаких /../ или /./
  • не начинаться с .. / или ./
  • не оканчиваются на / .. или /.

, чтобы вы могли сделать это (переносимо) с помощью оператора case:

    case "x$1" in
    (x*/..|x*/../*|x../*|x*/.|x*/./*|x./*)
        rc=1
        ;;
    (x/*)
        rc=0
        ;;
    (*)
        rc=1
        ;;
    esac
    return $rc

Это намеренно исключает такие вещи, как

/../../../foo/../../../bar

, которые допускает наивная интерпретация "ведущей косой черты".

Краткое определение абсолютного пути см. В realpath в POSIX.

5
28.05.2018, 19:51
3 ответа

Ошибка возникает из-за цитирования аргументов grepи того факта, что обратные апострофы не очень хорошо выполняют вложенность:

grep "`date +"%b %d"`"

Это лучше записать как

grep "`date +'%b %d'`"

... или даже лучше,

grep "$(date +'%b %d')"

На самом деле, используя $(...)вместо обратных кавычек, вы сможете сохранить внутренние двойные кавычки:

grep "$(date +"%b %d")"

Альтернативой сбору вывода lsможет быть выполнение

find. -type f -name "ABC.LOG*" -ctime -1

Это найдет все обычные файлы(-type f)в текущем каталоге, чьи имена соответствуют заданному шаблону и чье ctime меньше 24 часов с текущего времени . ctime файла — это время последней модификации данных или метаданных файла.

Это не совсем то же самое, что вы пытаетесь достичь. Это также рекурсирует в подкаталоги.

7
27.01.2020, 20:32

Команду findможно использовать для правильного инструмента вместо того, чтобы выполнять lsи grepрезультат, поэтому полезно отметить, что, пожалуйста,не анализируйте lsрезультат.

find /path/to/ -type f -name "ABC.LOG*$(date +"%b %d")*"

Выше ищется сегодняшняя дата в имя файла , если вы ищете файлы, созданные/измененные сегодняшней датой, вы можете использовать findтаким образом (GNU версияfind):

find /path/to -type f -name "ABC.LOG*" -newermt 00:00

Или за последние 24 часа:

find /path/to -type f -name "ABC.LOG*" -newermt yesterday

Или следующим образом:

find /path/to -type f -name "ABC.LOG*" -newermt "$(date +"%b %d")"
4
27.01.2020, 20:32

В оболочке Korn, как и в оболочке Bourne, кавычки и обратные кавычки (архаичная форма подстановки команд )может быть непревзойденной, и вы должны помочь токенизатору определить, где заканчиваются обратные кавычки. Внутри обратных кавычек есть еще один уровень обработки обратной косой черты.

echo "`date"

работает и совпадает с:

echo "`date`"
echo "$(date)"

И:

echo `echo "foo`

работает и совпадает с:

echo `echo "foo"`
echo $(echo "foo")

Если да:

grep "`date +"%b %d"`"

Это взято как grepслово, а затем"`date +"(незакрытые обратные кавычки внутри двойных кавычек )объединены с %bи затем %dобъединены с другими незакрытыми обратными кавычками внутри двойных -кавычек:"`". Так что это как

grep "$(date +)"%b %d"$()"

(за исключением того, что по какой-то причине, в то время как echo "``"или echo "$()"не вызвали бы ошибку, в echo "`"оболочка попытается выполнить команду с пустым именем (, как если бы вы написали echo "$("")").

Итак, здесь вам нужно использовать обратную косую черту, чтобы помочь синтаксическому анализатору:

grep "`date +\"%b %d\"`"

Эти обратные косые черты фактически удалены. Именно date +"%b %d"оценивается подоболочкой при подстановке команд.

Здесь, поскольку kshпринимает незакрытые кавычки, вы могли бы также сделать:

grep "`date +\"%b %d"

(не то чтобы я бы советовал это делать ).

Таким же образом можно получить вложенные обратные кавычки, как в:

echo "`echo \"\`echo \\\"a  b\\\"\`\"`"

Хороший пример того, почему никто никогда не использует этот синтаксис и использует $(...)более новую форму (, введенную kshв начале 80-х):

echo "$(echo "$(echo "a  b")")"

Теперь, что касается вашей конкретной проблемы, похоже, вы хотите перечислить ABC.LOG*файлы в текущем каталоге, которые последний раз -изменялись сегодня. Для этого вы можете сделать:

touch -t "$(date +%Y%m%d0000)".start-of-day &&
  find. ! -name. -prune -name 'ABC.LOG.*' \
    -newer.start-of-day -type f -exec ls -lrtd {} + &&
  rm -f.start-of-day
5
27.01.2020, 20:32

Теги

Похожие вопросы