Как выполнить несколько команд строк в bash? [Дубликат]

Я немного поиграл с super() и узнал, что мы можем изменить порядок вызова.

Например, у нас есть следующая структура иерархии:

    A
   / \
  B   C
   \ /
    D

In этот случай MRO of D будет (только для Python 3):

In [26]: D.__mro__
Out[26]: (__main__.D, __main__.B, __main__.C, __main__.A, object)

Давайте создадим класс, где super() вызывает после выполнения метода.

In [23]: class A(object): #  or with Python 3 can define class A:
...:     def __init__(self):
...:         print("I'm from A")
...:  
...: class B(A):
...:      def __init__(self):
...:          print("I'm from B")
...:          super().__init__()
...:   
...: class C(A):
...:      def __init__(self):
...:          print("I'm from C")
...:          super().__init__()
...:  
...: class D(B, C):
...:      def __init__(self):
...:          print("I'm from D")
...:          super().__init__()
...: d = D()
...:
I'm from D
I'm from B
I'm from C
I'm from A

    A
   / ⇖
  B ⇒ C
   ⇖ /
    D

Таким образом, мы можем видеть, что порядок разрешения такой же, как в MRO. Но когда мы назовем super() в начале метода:

In [21]: class A(object):  # or class A:
...:     def __init__(self):
...:         print("I'm from A")
...:  
...: class B(A):
...:      def __init__(self):
...:          super().__init__()  # or super(B, self).__init_()
...:          print("I'm from B")
...:   
...: class C(A):
...:      def __init__(self):
...:          super().__init__()
...:          print("I'm from C")
...:  
...: class D(B, C):
...:      def __init__(self):
...:          super().__init__()
...:          print("I'm from D")
...: d = D()
...: 
I'm from A
I'm from C
I'm from B
I'm from D

У нас есть другой порядок, он меняет порядок кортежа MRO.

    A
   / ⇘
  B ⇐ C
   ⇘ /
    D 

Для Дополнительное чтение Я бы рекомендовал следующие ответы:

  1. Пример линеаризации C3 с супер (большая иерархия)
  2. Важные изменения поведения между старыми и новые классы стиля
  3. Внутренняя история о классах нового стиля

64
задан dcharles 9 January 2013 в 01:33
поделиться

3 ответа

Символ - обратная косая черта \

Из руководства bash :

Символ обратной косой черты '\' может использоваться для удалить любое специальное значение для следующего прочитанного символа и для продолжения строки.

85
ответ дан Paolo 21 August 2018 в 02:29
поделиться
  • 1
    Благодарю. и каков обычный предел в столбцах сценария bash? – flow 6 October 2010 в 11:06
  • 2
    bash не имеет никакого интересного предела столбца; для ясности вы должны попытаться ограничить до 70-80 символов на столбе. – Habbie 6 October 2010 в 11:07
  • 3
    @RyanM Обратная косая черта должна быть последним символом перед символом конца строки. Вы уверены, что у вас нет пробелов после \? – George 20 October 2013 в 00:31
  • 4
    @George Да. Немного более возиться выплюнуть ошибку с помощью ^M. Проблема заключается в том, что сценарий был предоставлен мне тем, кто использует окна. Быстрый dos2unix исправил это :) – RyanM 20 October 2013 в 01:04
  • 5
    @George, ваш комментарий просто спас меня, у меня было место после \, и я не мог понять, что случилось. Ура! – ffledgling 16 December 2013 в 16:39

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

# In general
$ echo "foo" \
> "bar"
foo bar

# Pipes
$ echo foo |
> cat
foo

# && and ||
$ echo foo &&
> echo bar
foo
bar
$ false ||
> echo bar
bar

Различные, но связанные, являются неявным продолжением внутри кавычек. В этом случае без обратная косая черта, вы просто добавляете новую строку в строку.

$ x="foo
> bar"
$ echo "$x"
foo
bar

С обратная косая черта, вы снова раскалываете логическая строка в несколько логических строк.

$ x="foo\
> bar"
$ echo "$x"
foobar
19
ответ дан chepner 21 August 2018 в 02:29
поделиться
  • 1
    Существует ли формальный список таких ситуаций, когда команда неявно продолжается на следующую строку? Мне кажется, что я могу оставить обратную косую черту в определенных обстоятельствах в состоянии [[ - ]], но не в других, и я пытаюсь выяснить правила. – Menachem 5 January 2018 в 05:04

\ выполняет эту работу. Ответ Гийома и комментарий Дж. Джорджа четко отвечают на этот вопрос. Здесь я объясняю, почему The backslash has to be the very last character before the end of line character. Рассмотрим эту команду:

   mysql -uroot \
   -hlocalhost      

Если после \ есть пробел, продолжение строки не будет работать. Причина в том, что \ удаляет особое значение для следующего символа, который является пространством, а не невидимым символом линии. Символ перевода строки находится после пробела, а не \ в этом примере.

10
ответ дан Jingguo Yao 21 August 2018 в 02:29
поделиться
  • 1
    Спасибо, что указали «самый последний символ». часть. Я немного расстроился, следя за этой ошибкой. – Jason 1 November 2016 в 05:51
Другие вопросы по тегам:

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