Skip to content

Piping Data

One of run's most powerful features is seamless integration with Unix pipelines.

Reading from stdin

Your code can read from stdin:

echo "hello world" | run python "
import sys
text = sys.stdin.read()
print(text.upper())
"

Output:

HELLO WORLD

JSON Processing

Python

echo '{"name":"Ada","age":30}' | run python "
import sys, json
data = json.load(sys.stdin)
print(f\"{data['name']} is {data['age']} years old\")
"

JavaScript

echo '{"name":"Ada","age":30}' | run js "
const data = JSON.parse(require('fs').readFileSync(0, 'utf-8'));
console.log(\`\${data.name} is \${data.age} years old\`);
"

Multi-Language Pipelines

Chain different languages together:

# Python generates JSON
run python "import json; print(json.dumps({'numbers': [1,2,3,4,5]}))" | \
# JavaScript processes it
run js "
const data = JSON.parse(require('fs').readFileSync(0, 'utf-8'));
const doubled = data.numbers.map(n => n * 2);
console.log(JSON.stringify({doubled}));
" | \
# Python displays it
run python "
import sys, json
result = json.load(sys.stdin)
print('Doubled:', result['doubled'])
"

Output:

Doubled: [2, 4, 6, 8, 10]

Text Processing

# Count lines
cat file.txt | run python "import sys; print(len(sys.stdin.readlines()))"

# Extract emails
cat text.txt | run python "
import sys, re
text = sys.stdin.read()
emails = re.findall(r'[\w\.-]+@[\w\.-]+', text)
print('\n'.join(emails))
"

# Convert to uppercase
cat file.txt | run ruby "puts STDIN.read.upcase"

CSV Processing

cat data.csv | run python "
import sys, csv
reader = csv.reader(sys.stdin)
for row in reader:
    print(','.join(row[:3]))  # First 3 columns
"

Next Steps

Language Detection →