而不是以下内容
printf '%s\t%s\t%s\t%s\n' 'index' 'podcast' 'website' 'YouTube'
我想将 printf 输出存储在 Results 变量中,我该怎么做?
而不是以下内容
printf '%s\t%s\t%s\t%s\n' 'index' 'podcast' 'website' 'YouTube'
我想将 printf 输出存储在 Results 变量中,我该怎么做?
我用的是jq 1.7
我正在对 yt-dlp 下载的 info.json 进行操作
yt-dlp --write-info-json --skip-download https://www.youtube.com/watch?v=vlIO-7Rpi7c
de
,en-US
并在其中de
选择en-US
所有带有 element 的对象ext == vtt
。这成功地工作如下:
jq 'pick(.subtitles | .de[],."en-US"[] | select (.ext == "vtt")) | del(..|nulls)' *.json
输出
{
"subtitles": {
"de": [
{
"ext": "vtt",
"url": "https://www.youtube.com/api/timedtext?v=vlIO-7Rpi7c&ei=JS05ZoT2Ftf0i9oP8dy4mAo&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1715048341&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=AB2ECEEABF48D1A16ADC7ACCB8A072D63EE12DCC.5F56904251766FB68624A68FF2BBB57B9CCFFD2F&key=yt8&lang=de&fmt=vtt",
"name": "German"
}
],
"en-US": [
{
"ext": "vtt",
"url": "https://www.youtube.com/api/timedtext?v=vlIO-7Rpi7c&ei=JS05ZoT2Ftf0i9oP8dy4mAo&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1715048341&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=AB2ECEEABF48D1A16ADC7ACCB8A072D63EE12DCC.5F56904251766FB68624A68FF2BBB57B9CCFFD2F&key=yt8&lang=en-US&fmt=vtt",
"name": "English (United States)"
}
]
}
}
对于某些Youtube视频,json文件不包含“en-US”而是包含“en”,而有些则包含de、en、en-US这三个。所以我写了以下内容
jq 'pick(.subtitles | .de[],.en[],."en-US"[] | select (.ext == "vtt")) | del(..|nulls)' *.json
jq: 错误 (at:69): 无法迭代 null (null)
如果 json 文件中并非所有这些语言都存在,如何仅选择 .ext == "vtt" 仅适用于 en、en-US、de 语言?
有什么建议么?我读到:转义序列(GNU Awk 用户指南)
$ Filesystem='/dev/mapper/vgubuntu-Media'
$ FilesystemRegex="$(echo "${Filesystem}" | sed "s~/~\\\/~g")"
$ echo "$FilesystemRegex"
\/dev\/mapper\/vgubuntu-Media
$ df -H "${Filesystem}" | awk -v Regex="${FilesystemRegex}" '/$Regex/{print $5}'
awk: warning: escape sequence `\/' treated as plain `/'
$ df -H "${Filesystem}" | awk '/\/dev\/mapper\/vgubuntu-Media/{print $5}'
62%
sudo lsblk --fs -o NAME,FSTYPE,SIZE,FSSIZE,FSUSED,FSAVAIL,FSUSE%,MOUNTPOINTS,LABEL,PATH | grep -v '^loop'
NAME FSTYPE SIZE FSSIZE FSUSED FSAVAIL FSUSE% MOUNTPOINTS LABEL PATH
zram0 8G [SWAP] /dev/zram0
nvme0n1 1.8T /dev/nvme0n1
├─nvme0n1p1 ext4 768M /dev/nvme0n1p1
├─nvme0n1p2 ext4 768M 738.4M 240.9M 443.8M 33% /boot FedoraBoot /dev/nvme0n1p2
├─nvme0n1p3 ext4 768M UnassignedBoot /dev/nvme0n1p3
├─nvme0n1p4 vfat 128M 127.7M 22.4M 105.3M 18% /boot/efi EFI-SP /dev/nvme0n1p4
└─nvme0n1p5 LVM2_member 1.8T /dev/nvme0n1p5
├─vgubuntu-FedoraRoot ext4 100G 98.1G 47.9G 45.2G 49% / FedoraRoot /dev/mapper/vgubuntu-FedoraRoot
├─vgubuntu-FedoraSwap swap 32G [SWAP] /dev/mapper/vgubuntu-FedoraSwap
├─vgubuntu-UbuntuSwap swap 32G /dev/mapper/vgubuntu-UbuntuSwap
├─vgubuntu-UbuntuRoot ext4 50G /dev/mapper/vgubuntu-UbuntuRoot
├─vgubuntu-UbuntuHome ext4 18G /dev/mapper/vgubuntu-UbuntuHome
├─vgubuntu-FedoraHome ext4 18G 17.5G 6.5G 10.1G 37% /home FedoraHome /dev/mapper/vgubuntu-FedoraHome
├─vgubuntu-Data ext4 100G 98.1G 82G 11.6G 84% /mnt/Data Data /dev/mapper/vgubuntu-Data
├─vgubuntu-Documents ext4 250G 245G 208.5G 24G 85% /mnt/Documents Documents /dev/mapper/vgubuntu-Documents
├─vgubuntu-Media ext4 500G 491.1G 331.2G 134.8G 67% /mnt/Media Media /dev/mapper/vgubuntu-Media
└─vgubuntu-Backup ext4 100G 97.9G 9.1G 83.7G 9% /mnt/Backup Backup /dev/mapper/vgubuntu-Backup
我有一个脚本(例如Task.sh
)(具有可执行权限):
伪代码:
if [[ Not called from inside a script ]]; then
echo 'Not called from inside a script'
else
echo 'Called from a script'
fi
我有一个脚本Main.sh
(具有可执行权限):
Value=$(Task.sh)
echo "${Value}"
$ Task.sh
Not called from inside a script
$ Main.sh
Called from a script
请建议在伪代码中添加什么条件Task.sh
脚本输出 3 行输出:
$ Filename /a/Resource/.Filename.man.markdown
.Filename.man.markdown
.Filename
man.markdown
我想将 3 行输出存储在单独的变量中,我该怎么做?
Filename /a/Resource/.Filename.man.markdown | IFS=$'\n' read -r File1 Filename1 Extension1
echo "$File1 $Filename1 $Extension1"
$ IFS=$'\n' read -r File1 Filename1 Extension1 < <(Filename /a/Resource/.Filename.man.markdown)
$ echo "$File1 $Filename1 $Extension1"
.Filename.man.markdown
我想删除所有字符,直到[a-zA-Z]
字符串中的第一个字母。例如:
#121Abc
-->Abc
%Ab#c
-->Ab#c
Ab#c
-->Ab#c
Abc
-->Abc
1Abc
-->Abc
1 21Abc
-->Abc
1^1 Abc
-->Abc
注意:所有非字母都包括非印刷字符。
bash工具可以吗?
column
可在包util-linux
和bsdmainutils
. 这两个软件包都安装在 Linux Mint 20.2 中
$ type column
column is /usr/bin/column
column is /bin/column
这两个列都指向 bsd 列工具。我如何访问该工具util-linux
?
当我echo "${PATH}" | tr -s ':' '\n' | nl
从 bash 脚本中键入并在终端上时,我得到相同的结果:
1 /home/nikhil/Documents/Git/Cs/Architecture/bin
2 /home/nikhil/.local/bin
3 /home/nikhil/opt/.nvm/versions/node/v16.13.0/bin
4 /home/nikhil/opt/bin
5 /usr/local/sbin
6 /usr/local/bin
7 /usr/sbin
8 /usr/bin
9 /sbin
10 /bin
11 /usr/games
12 /usr/local/games
13 /snap/bin
14 /home/linuxbrew/.linuxbrew/bin
15 /home/linuxbrew/.linuxbrew/sbin
16 /home/nikhil/.cargo/bin
17 /home/nikhil/.cabal/bin
18 /home/nikhil/opt/go/bin
19 /home/nikhil/.ruby/bin
20 /home/linuxbrew/.linuxbrew/opt/fzf/bin
但是当我在 bash 脚本和终端上键入以下内容时,我会得到不同的结果:
# From Terminmal
$ type pandoc
pandoc is aliased to `/usr/bin/pandoc'
pandoc is /usr/bin/pandoc
pandoc is /home/linuxbrew/.linuxbrew/bin/pandoc
pandoc is /home/nikhil/.cabal/bin/pandoc
# From inside bash script
pandoc is /usr/bin/pandoc
为什么type
bashscript 内部和终端的输出不同?如何使 bash 脚本type
输出与终端的输出相同?
我做了如下:
$ gsettings get org.gnome.desktop.session idle-delay
uint32 300
$ gsettings set org.gnome.desktop.session idle-delay 80
$ gsettings get org.gnome.desktop.session idle-delay
uint32 80
但是当我这样做时:dconf dump /org/gnome/
,我看到如下:
$ dconf dump /org/gnome/desktop/session
[/]
idle-delay=uint32 60
观察:dconf dump
显示真实值,但gsettings
显示新值但与 dconf-editor 显示的不同
$ dconf dump /org/gnome/desktop/session
[/]
idle-delay=uint32 60
$ gsettings get org.gnome.desktop.session idle-delay
uint32 300
观察:dconf dump
显示真实值,但gsettings
显示默认值
这是否意味着它gsettings
不能在我的系统上运行?如果是这样,我该如何解决这个问题?
我有一个 shell 脚本,它为每个 Markdown 文件创建一个函数(在 bashscript 文件中.bashrc
),以便在编辑器中打开它。
例子:
ls /home/nikhil/Notes/Studies
Physics.md
Chemistry.md
Studies.md
index.md
ls /home/nikhil/Notes/Sports
Football.md
Cricket.md
index.md
如您所见,某些文件夹(例如 Studies)包含同名文件(Studies.md)和 index.md,而其他文件夹(例如 Sports)包含 index.md 但不包含 Sports.md
现在,我的 bashscript 创建以下函数
oPhysics(){ ${Editor:-vim} /home/nikhil/Notes/Studies/Physics.md }
oChemistry(){ ${Editor:-vim} /home/nikhil/Notes/Studies/Chemistry.md }
oStudies(){ ${Editor:-vim} /home/nikhil/Notes/Studies/Studies.md }
oiStudies(){ ${Editor:-vim} /home/nikhil/Notes/Studies/index.md }
oFootball(){ ${Editor:-vim} /home/nikhil/Notes/Sports/Football.md}
oCricket(){ ${Editor:-vim} /home/nikhil/Notes/Sports/Cricket.md}
oiSports(){ ${Editor:-vim} /home/nikhil/Notes/Sports/index.md}
注意:oStudies
andoiStudies
存在,while 只oiSports
存在。
现在,作为用户,我想输入oStudies
or oSports
(这会失败)而不是oiSports
,它应该在函数不存在oiSports
时自动运行。oSports
这是因为,大多数时候用户对打开正常的 markdown 文件感兴趣,只有当它们不存在时用户才想打开index.md
. 用户不记得只有 index.md 存在于哪个文件夹(例如 Sports 文件夹)。
我怎样才能做到这一点?我正在寻找的模式是在不存在的情况下运行一个函数oiBlahBlah
,oBlahBlah
因为它oBlahBlah
是由用户调用的。
制作别名不起作用,因为我不想oStudies
执行oiStudies
.md
这是一个简化的代码,如果它包含与父目录和扩展名相同的文件名,则打印目录的名称。
FIND(){
find . -type d -exec sh -c '
for d do
[ -f "${d}/${d##*/}.md" ] && printf "%s\n" "$d"
done' find-sh {} +
}
FIND
概括地说,我想将搜索词${d}/${d##*/}.md
作为参数发送给FIND
函数,但不幸的是,这不会输出任何内容:
FIND(){
local SearchTerm="${1}"
find . -type d -exec sh -c '
for d do
[ -f "${SearchTerm}" ] && printf "%s\n" "$d"
done' find-sh {} +
}
FIND '${d}/${d##*/}.md'
我确信 . 的引用存在一些问题SearchTerm
。有什么提示吗?
我试过了:FIND '\${d}/\${d##*/}.md'
但没有输出
下面的代码片段使用了一个自定义函数 HexNewLine,它基本上转换了 hexdump 并在字符处中断 0x0a
$ echo -e "\t{
> "dependencies": {
> "prettier": {
> "version": "1.18.2",
> "from": "[email protected]",
> "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz"
> }
> }
> }" | HexNewLine
00000000 09 7b 0a '.{.'
0000000a 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 3a 20 ' dependencies: '
0000001a 7b 0a '{.'
0000001c 20 20 20 20 70 72 65 74 74 69 65 72 3a 20 7b 0a ' prettier: {.'
0000002c 20 20 20 20 20 20 76 65 72 73 69 6f 6e 3a 20 31 ' version: 1'
0000003c 2e 31 38 2e 32 2c 0a '.18.2,.'
00000043 20 20 20 20 20 20 66 72 6f 6d 3a 20 70 72 65 74 ' from: pret'
00000053 74 69 65 72 40 31 2e 31 38 2e 32 2c 0a '[email protected],.'
00000060 20 20 20 20 20 20 72 65 73 6f 6c 76 65 64 3a 20 ' resolved: '
00000070 68 74 74 70 73 3a 2f 2f 72 65 67 69 73 74 72 79 'https://registry'
00000080 2e 6e 70 6d 6a 73 2e 6f 72 67 2f 70 72 65 74 74 '.npmjs.org/prett'
00000090 69 65 72 2f 2d 2f 70 72 65 74 74 69 65 72 2d 31 'ier/-/prettier-1'
000000a0 2e 31 38 2e 32 2e 74 67 7a 0a '.18.2.tgz.'
000000aa 20 20 20 20 7d 0a ' }.'
000000b0 20 20 7d 0a ' }.'
000000b4 7d 0a '}.'
tr
用来在换行符后添加一个制表符,但没有任何反应!$ echo -e "\t{
> "dependencies": {
> "prettier": {
> "version": "1.18.2",
> "from": "[email protected]",
> "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz"
> }
> }
> }" | tr '\n' '\n\t'
{
dependencies: {
prettier: {
version: 1.18.2,
from: [email protected],
resolved: https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz
}
}
}
我正在使用 Bash 4.4.20。我通常在每个 bashscript 中都有 main 函数。如果我想从另一个 bash 脚本中的另一个函数获取这个脚本,这会与两个脚本中的主函数定义冲突吗?
#A.sh
main() {
SomeFunction
}
SomeFunction(){
. B.sh
}
main "$@"
#B.sh
main(){
echo Hi
}
main "$@"
有没有不重命名主要功能的解决方案?
我在另一个 bashscript (Parent) 中获取一个 bashscript (Child),位于 Parent 中间的某个位置。执行时传递给 Parent 的参数会传递给 Child。如何防止这种行为?我不希望父母的论点也转移给孩子。
注意:父子类比不是关于父子过程,而是关于先于另一个的东西。
此外,我想拥有源脚本的父脚本环境(传递给它的参数除外)。这是因为,脚本参数的默认值不同。请参见下面的示例。 父脚本使用源脚本中定义的一些函数,并且源脚本创建父脚本正在使用的数组。另外,在获取子脚本后,我需要父脚本的位置参数。
#!/usr/bin/env bash
# - goal: "Parent"
main() {
# # Path
#dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
# # Argument
ParentArgument=${1:-40}
echo "ParentArgument=${ParentArgument}"
. Child.sh
}
main "$@"
#!/bin/false
# shellcheck shell=bash
# - goal: "Child"
main() {
# # Path
#dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
# # Argument
ChildArgument=${1:-30}
echo "ChildArgument=${ChildArgument}"
}
main "$@"
$ ./Parent.sh 50
ParentArgument=50
ChildArgument=50
$ ./Parent.sh 50
ParentArgument=50
ChildArgument=30
$ find -name "Bik*"
./Biking
./Biking/Unsync/Biking.md.~6~
./Biking/Rendered/Biking.gen.html
./Biking/Biking.md
现在,当我用变量替换表达式时,如下所示:
$ a='-name "Bik*"'
$ find $a
我没有输出。为什么会这样?应该修改什么?
我想找到所有包含同名(和扩展名.md
)的降价文件的子文件夹。
例如:我想查找以下子文件夹:
Apple/Banana/Orange #Apple/Banana/Orange/Orange.md exists
Apple/Banana #Apple/Banana/Banana.md exists
Apple/Banana/Papaya #Apple/Banana/Papaya/Papaya.md exists
有什么建议么?
可以使用以下代码测试问题的解决方案:
#!/usr/bin/env bash
# - goal: "Test"
# - author: Nikhil Agarwal
# - date: Wednesday, August 07, 2019
# - status: P T' (P: Prototyping, T: Tested)
# - usage: ./Test.sh
# - include:
# 1.
# - refer:
# 1. [directory - Find only those folders that contain a File with the same name as the Folder - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/534190/find-only-those-folders-that-contain-a-file-with-the-same-name-as-the-folder)
# - formatting:
# shellcheck disable=
#clear
main() {
TestData
ExpectedOutput
TestFunction "${1:?"Please enter a test number, as the first argument, to be executed!"}"
}
TestFunction() {
echo "Test Function"
echo "============="
"Test${1}"
echo ""
}
Test1() {
echo "Description: Thor"
find . -type f -regextype egrep -regex '.*/([^/]+)/\1\.md$' | sort
echo "Observation: ${Green:=}Pass, but shows filepath instead of directory path${Normal:=}"
}
Test2() {
echo "Description: Kusalananda1"
find . -type d -exec sh -c '
dirpath=$1
set -- "$dirpath"/*.md
[ -f "$dirpath/${dirpath##*/}.md" ] && [ "$#" -eq 1 ]' sh {} \; -print | sort
echo "Observation: ${Red:=}Fails as it ignores B.md${Normal:=}"
}
Test3() {
echo "Description: Kusalananda2"
find . -type d -exec sh -c '
for dirpath do
set -- "$dirpath"/*.md
if [ -f "$dirpath/${dirpath##*/}.md" ] && [ "$#" -eq 1 ]
then
printf "%s\n" "$dirpath"
fi
done' sh {} + | sort
echo "Observation: ${Red:=}Fails as it ignores B.md${Normal:=}"
}
Test4() {
echo "Description: steeldriver1"
find . -type d -exec sh -c '[ -f "$1/${1##*/}.md" ]' find-sh {} \; -print | sort
echo "Observation: ${Green:=}Pass${Normal:=}"
}
Test5() {
echo "Description: steeldriver2"
find . -type d -exec sh -c '
for d do
[ -f "$d/${d##*/}.md" ] && printf "%s\n" "$d"
done' find-sh {} + | sort
echo "Observation: ${Green:=}Pass${Normal:=}"
}
Test6() {
echo "Description: Stéphane Chazelas"
find . -name '*.md' -print0 \
| gawk -v RS='\0' -F/ -v OFS=/ '
{filename = $NF; NF--
if ($(NF)".md" == filename) include[$0]
else exclude[$0]
}
END {for (i in include) if (!(i in exclude)) print i}'
echo "Observation: ${Red:=}Fails as it ignores B.md${Normal:=}"
}
Test7() {
echo "Description: Zach"
#shellcheck disable=2044
for fd in $(find . -type d); do
dir=${fd##*/}
if [ -f "${fd}/${dir}.md" ]; then
ls "${fd}/${dir}.md"
fi
done
echo "Observation: ${Green:=}Pass but shows filepath instead of directory${Normal:=}"
}
ExpectedOutput() {
echo "Expected Output"
echo "==============="
cat << EOT
./GeneratedTest/A
./GeneratedTest/A/AA
./GeneratedTest/B
./GeneratedTest/C/CC1
./GeneratedTest/C/CC2
EOT
}
TestData() {
rm -rf GeneratedTest
mkdir -p GeneratedTest/A/AA
touch GeneratedTest/index.md
touch GeneratedTest/A/A.md
touch GeneratedTest/A/AA/AA.md
mkdir -p GeneratedTest/B
touch GeneratedTest/B/B.md
touch GeneratedTest/B/index.md
mkdir -p GeneratedTest/C/CC1
touch GeneratedTest/C/index.md
touch GeneratedTest/C/CC1/CC1.md
mkdir -p GeneratedTest/C/CC2
touch GeneratedTest/C/CC2/CC2.md
mkdir -p GeneratedTest/C/CC3
touch GeneratedTest/C/CC3/CC.md
mkdir -p GeneratedTest/C/CC4
}
main "$@"
我想传递以下一组 bash 命令
{ echo Apple; echo Banana; }
作为 bash 函数的参数,定义.bashrc
如下:
BashFunction(){
"$@" | SomeOtherFunction
}
BashFunction '{ echo Apple; echo Banana; }'
但我得到这个错误:
{ echo Apple; echo Banana; }: command not found
如果我从 bash 函数中删除引号
BashFunction(){
$@ | SomeOtherFunction
}
然后我得到这个错误
{: command not found
为什么 cron 需要 MTA 进行日志记录?这有什么特别的好处吗?为什么它不能像大多数其他实用程序一样创建日志文件?