почему функция cd в скрипте не работает

touch основная цель команды управляет метками времени файлов, и для создания файлов.

Примеры

1. создание файлов

$ ls -l
total 0

$ touch file{1..3}

$ ls -l
total 0
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file1
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file2
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file3

Примечание: total 0 вывод от ls -l корректно. Эта реализация ls показывает количество блоков, используемых файлами, когда они перечислены. Можно убедиться этого факта путем добавления -s переключатель к ls. Это перечислит блоки, используемые каждым файлом. Здесь я добавил 2 символа к file1 и file2.

Пример

$ ls -ls
total 8
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:07 file1
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:09 file2
0 -rw-rw-r--. 1 saml saml 0 Jan 13 12:05 file3

2. информация времени/даты файла - команда статистики

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-01-12 13:33:38.279456149 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:33:38.279456149 -0500
 Birth: -

Мы можем использовать touch управлять различными метками времени на данном файле.

3. выборка из сенсорной страницы справочника

   -a     change only the access time
   -m     change only the modification time
   -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

4. управление временем доступа

$ touch -a -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:38:52.023434696 -0500
 Birth: -

5. управляйте изменяют время

$ touch -m -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2000-01-01 00:00:00.000000000 -0500
Change: 2014-01-12 13:39:31.060432026 -0500
 Birth: -

Вы могли бы задаваться вопросом во время изменения (ctime). С помощью это нельзя управлять touch. Это отслеживает время, любые из метаданных были затронуты файла. Дополнительную информацию см. в этом Вопросы и ответы U&L, названные: Что можно сделать в файл, не инициировав Метку времени "Изменения"?.

2
01.10.2015, 22:02
2 ответа

Это потому, что команда cd выполняется внутри сценария, а не в вашей текущей среде оболочки. Если вы хотите, чтобы сценарий запускался в вашей текущей среде оболочки, запустите его следующим образом:

. /path/to/script.sh

Вывод моего собственного рабочего примера вашего сценария с pwd вместо вашего if оператор:

Jamey@CNU326BXDX ~
$ /usr/local/bin/this.sh
/cygdrive/c/users/jamey/downloads

Jamey@CNU326BXDX ~
$ . /usr/local/bin/this.sh
/cygdrive/c/users/jamey/downloads

Jamey@CNU326BXDX /cygdrive/c/users/jamey/downloads
$

Обратите внимание на текущий рабочий каталог после второго запуска сценария.

2
27.01.2020, 21:56

Ваш скрипт и особенно его внутренние команды cd прекрасно работают при вызове из bash с использованием source или эквивалентных . команды.

Главная проблема в том, что, как уже было сказано в комментарии @adonis, ваша оболочка, после правильной смены каталога, выйдет, если только файл с точным именем "*.cfg" не существует, что очень сомнительно.

Поскольку я предполагаю, что вы хотите использовать *.cfg в качестве образца, вот как я бы слегка изменил ваш скрипт, чтобы он работал как ожидалось:

#!/bin/bash # Note that the shebang is useless for a sourced script

model_dir=/mypath

chdir() { # use either function or (), both is a non portable syntax
  cd $1
}

chdir ${model_dir}/config
if [ ! -s *.cfg ]; then # Single brackets here for the shell to expand *.cfg
  echo $(date) "configure file does not exist"
  exit 1  # dubious in a sourced script, it will end the main and only shell interpreter
fi
3
27.01.2020, 21:56

Теги

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