當腳本位於 shell 的 stdin 上時,apt-get 之後的 shell 腳本中的命令未正確執行

德拉卡

我有一個腳本,簡化為以下:

echo Step one...
apt-get install -y --reinstall ca-certificates 
echo Step two...

對於這個用例,我不能直接運行它,它必須通過管道傳輸到 bash,如下所示:

cat script.sh | bash

問題顯示在下面的輸出中,其中 apt-get 命令(從第二個 echo 語句開始)之後的任何內容都沒有執行,而是顯示而不是執行 echo 命令

我怎樣才能使這項工作?

# cat uu | bash
Step one...
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 509 not upgraded.
Need to get 0 B/166 kB of archives.
After this operation, 0 B of additional disk space will be used.
Preconfiguring packages ...

echo Step two...
(Reading database ... 131615 files and directories currently installed.)
Preparing to unpack .../ca-certificates_20170717~14.04.2_all.deb ...
Unpacking ca-certificates (20170717~14.04.2) over (20170717~14.04.2) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Setting up ca-certificates (20170717~14.04.2) ...
Processing triggers for ca-certificates (20170717~14.04.2) ...
Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.

請注意echo Step two...apt-get仍在執行如何在輸出中顯示,而不是在完成後作為命令運行。

查爾斯·達菲

這裡的問題是 apt-get 或者它在重新配置這個特定包時啟動的東西,正在消耗你只希望 bash 解釋器本身讀取的內容。

一個狹窄的(逐個命令)方法是重定向 apt-get 的標準輸入/dev/null

#!/usr/bin/env bash
echo Step one...
apt-get install -y --reinstall ca-certificates </dev/null
echo Step two...                              #^^^^^^^^^^

更通用的方法是將您的代碼封裝在一個函數中,並僅在腳本末尾調用該函數:

#!/usr/bin/env bash
main() {
  echo Step one...
  apt-get install -y --reinstall ca-certificates 
  echo Step two...
}
main

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Shell脚本中关闭stdin?

如何从shell中检查stdin是否为/ dev / null?

Shell:两个命令的STDIN / STDOUT的相互管道

Shell会话中存在多少个STDIN?

如何在 shell 中检查正确数量的 STDIN 用户输入?

在 Jenkins 管道代碼中通過 shell 腳本運行時找不到 SQL 命令

當在子shell腳本中運行時,scp沒有列出

shell 腳本中的標題列驗證

在 PutFile 之後執行 Python 腳本(Apache - NiFi)

Power Shell 簡單腳本

如何在shell腳本中組合exec命令

Shell 腳本應該等到 kubernetes pod 運行

如何使用自定義文件夾中的所有腳本,如 macOS 中的本機 shell 命令

${@:3} shell 腳本後如何接受參數

從 shell 腳本中的文件讀取時缺少字符

正則表達式匹配 shell 腳本中數組中的數字

用於循環的 shell 腳本中的多個條件

如何在執行之前查找和替換 build.gradle 中的行,使用 shell 腳本

Jenkins 和 Shell 腳本 - 無法更改日期時間值

Power Shell 腳本未使用 [] 字符重命名文件

用於從多個 Hive 數據庫中的所有 Hive 表中提取行數的 Shell 腳本

Ansible 調用執行帶有特定標籤的 shell 腳本

當我不知道文件名稱時重命名文件 - shell 腳本

如何在 shell 腳本中運行 sacct 命令

'DEBIAN_FRONTEND=noninteractive' 在 apt-get 的 shell 腳本中不起作用

我需要在腳本執行結束時更新 shell 腳本中的源配置文件

在 Shell 腳本中匹配列和行

我在將 bash 命令轉換為 shell 腳本中的 shell 腳本語法錯誤時遇到錯誤

創建一個執行多個 grep 操作(AND 操作)的 shell 腳本