Для сценария оболочки действительно ли возможно содержать и tcsh и команды удара в том же сценарии?

  The  letters  `acdeijstuADST'  select the new attributes for the files:
  append only (a), compressed  (c),  no  dump  (d),  extent  format  (e),
  immutable (i), data journalling (j), secure deletion (s), no tail-merg‐
  ing (t), undeletable (u), no atime updates (A),  synchronous  directory
  updates  (D),  synchronous  updates (S), and top of directory hierarchy
  (T).

из страницы справочника для chattr

Файлы с этим флагом не будут открыты для записи. Это также блоки определенные потенциально разрушительные системные вызовы такой как truncate() или unlink().

$ touch foo
$ chattr +a foo
$ python
> file("foo", "w") #attempt to open for writing
[Errno 1] Operation not permitted: 'foo'
> quit()
$ truncate foo --size 0
truncate: cannot open `foo' for writing: Operation not permitted
$ echo "Appending works fine." >> foo
$ cat foo
Appending works fine.
$ rm foo
rm: cannot remove `foo': Operation not permitted
$ chattr -a foo
$ rm foo

Эта опция разработана для файлов журнала.

2
10.06.2012, 01:28
3 ответа

Нет, это не возможно.

Причина состоит в том, что оболочка читает в блоках файла, поскольку это выполняет его, и блок мог бы содержать код оболочки, который Вы хотите выполнить в другой оболочке, но с тех пор ее уже считанный первой оболочкой, второй наклон оболочки считал его, если это должно было принять выполнение сценария. (Это могло работать, если бы оболочка имела способность к lseek() файл, но языки оболочки просто не усовершенствованный),

Однако существует грязный способ сделать это; zsh.
zsh назвали команду emulate который позволяет Вам переключить языки оболочки на лету. Но использование zsh только для эмуляции tcsh и удара просто грязно, не говоря уже о чрезмерно сложном.

.

Также я не сказал бы, что удар более современен. Это более широко распространено уверенный, но это принимает функции в очень медленном темпе. Bash более фокусируется на совместимости, чем что-нибудь.

2
27.01.2020, 21:49
  • 1
    Принятие функций в "очень медленном темпе" не является действительно "плохой вещью". Посмотрите на то, сколько дистрибутивов Debian метал икру, и некоторые из тех затем породили бесчисленных других, но в таком количестве случаев, когда люди начинают сталкиваться с неожиданным поведением и хотят возвратиться к "тому, чтобы делать правильно вещи", они берут паузу, и начинают снова с Debian как основа. –  killermist 19.06.2012, 03:06

Я не рекомендовал бы смешать и соответствовать типам оболочки в рамках сценария.

  1. Вы теряете эффективность в запуске оболочки, чтобы выполнить команду и возвратить результат.
  2. Одна из причин сохранить все, в чем сценарий нужен в сценарии, - то, что тот сценарий имеет доступ ко всем переменным, объявленным и возвращенным из функций и т.д. При передаче всего переменного стека другой оболочке только, чтобы выполнить пару команд и затем возвратиться, кажется немного парадоксальным.

Я сказал бы, что Ваш лучший выбор будет состоять в том, чтобы скопировать известный сценарий и изменить оболочку вызова и затем видеть, какие повреждения, таким образом, Вы знаете, где различия в синтаксисе, это должно быть разработано.

Но, короче говоря, попытка к смешиванию и подгонке в рамках сценария просто походит на плохую идею. (лично)

6
27.01.2020, 21:49

Я соглашаюсь с другими ответами, что это обычно не прекрасная идея.

Но можно вызвать оболочку из сценария. Если Вам записали сценарий в настоящее время для использования tcsh, и Вы хотите использовать несколько определенных для удара функций, можно вызвать удар явно. Например, удар делает намного легче перенаправить stdout и stderr независимо.

#!/bin/tcsh -f

echo Hello, tcsh
bash -c 'echo Hello, bash 1>&2' # writes to stderr
echo Good-bye, tcsh

В конечном счете, тем не менее, вероятно, лучше перевести весь сценарий для использования удара.

Обязательная ссылка: http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/

4
27.01.2020, 21:49

Теги

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